【问题标题】:Format exception message thrown by Spring security in filter chain在过滤器链中格式化 Spring 安全抛出的异常消息
【发布时间】:2011-01-19 18:22:37
【问题描述】:

设置: Tomcat 上的 Resteasy + Spring Security。 客户端/服务器之间交换的数据采用 JSON 格式。 当应用抛出任何异常时,让异常映射器返回 JSON 格式的消息。

目标: 每当出现问题时,始终从服务器返回格式正确的 JSON 错误消息。

发生了什么: Spring Security 层在 servlet 容器调用方法 foo() 之前调用。如果这一层失败(例如错误的用户 ID),甚至在调用 servlet 之前就会引发异常,因此错误的格式不正确。 知道如何解决这个问题并在这种情况下返回 JSON 错误吗?

谢谢。

我的 web.xml 的一部分,如果有帮助的话:

<filter>
    <filter-name>securityPropagationFilter</filter-name>
    <filter-class>com.foo.bar.context.servlet.SecurityContextPropagationFilter</filter-class>
</filter>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter>
    <filter-name>loggingFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>securityPropagationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>loggingFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<listener>
    <listener-class>
        org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
    </listener-class>
</listener>

<servlet>
    <servlet-name>
        Resteasy
    </servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
    </servlet-class>
</servlet>

【问题讨论】:

    标签: java servlets exception-handling tomcat6 resteasy


    【解决方案1】:

    我通过将以下内容添加到我的 web.xml 中解决了这个问题

    <error-page>
        <error-code>403</error-code>
        <location>403.json</location>
    </error-page>
    

    另一方面,我需要为我需要处理的每个错误代码输入一个条目。但我想如果我也必须在 Spring 中调整异常处理程序,我也必须这样做。

    【讨论】:

      【解决方案2】:

      我将不得不深入挖掘,但您可以使用 RESTeasy 或 Spring 中的异常映射器来解决这个问题。

      【讨论】:

      • 在 spring security 中可能会处理这个问题 - 还没有尝试过。但是异常映射器在这种情况下不起作用。只有当被调用的 api 抛出异常时,才会调用异常映射器。但在我的情况下,异常将在安全过滤器链中生成(在调用实际服务之前执行 - 所以它不会到达异常被“映射”的地步。)
      猜你喜欢
      • 2018-06-03
      • 2014-05-20
      • 2017-04-20
      • 2013-04-20
      • 2016-05-07
      • 2015-09-06
      • 2016-04-08
      • 1970-01-01
      相关资源
      最近更新 更多