Spring安全性在过滤器链中抛出的格式异常消息

时间:2011-01-19 18:22:38

标签: java servlets exception-handling tomcat6 resteasy

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

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

发生了什么: 在由servlet容器调用方法foo()之前调用Spring Security层。如果此层失败(例如,错误的用户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>

2 个答案:

答案 0 :(得分:1)

我通过在web.xml中添加以下内容来解决这个问题

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

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

答案 1 :(得分:0)

我需要深入挖掘一下,但是你可以通过RESTeasy或Spring中的异常映射器解决这个问题。