Java 格式化筛选器链中Spring security引发的异常消息

Java 格式化筛选器链中Spring security引发的异常消息,java,servlets,exception-handling,tomcat6,resteasy,Java,Servlets,Exception Handling,Tomcat6,Resteasy,设置: Tomcat上的Resteasy+Spring安全性。 客户机/服务器之间交换的数据采用JSON格式。 让异常映射程序在应用程序引发任何异常时返回JSON格式的消息 目标: 每当出现问题时,总是从服务器返回格式正确的JSON错误消息 正在发生的事情: Spring安全层在servlet容器调用方法foo()之前被调用。如果该层失败(例如,错误的用户id),则即使在调用servlet之前也会引发异常,因此错误的格式不正确。 你知道在这种情况下如何绕过这个问题并返回JSON错误吗 谢谢 my

设置: Tomcat上的Resteasy+Spring安全性。 客户机/服务器之间交换的数据采用JSON格式。 让异常映射程序在应用程序引发任何异常时返回JSON格式的消息

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

正在发生的事情: Spring安全层在servlet容器调用方法foo()之前被调用。如果该层失败(例如,错误的用户id),则即使在调用servlet之前也会引发异常,因此错误的格式不正确。 你知道在这种情况下如何绕过这个问题并返回JSON错误吗

谢谢

my 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>

securityPropagationFilter
com.foo.bar.context.servlet.SecurityContextPropagationFilter
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
日志过滤链
org.springframework.web.filter.DelegatingFilterProxy
securityPropagationFilter
/*
springSecurityFilterChain
/*
日志过滤链
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
放松
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher

我需要更深入地挖掘,但您可能可以使用RESTeasy或Spring中的异常映射器来解决这个问题

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

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

403
403.json

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

可能在Spring security中处理这个问题-我还没有尝试过。但是异常映射器在这种情况下不起作用。只有当被调用的api抛出异常时,才会调用异常映射程序。但在我的例子中,异常将在安全过滤器链中生成(在调用实际服务之前执行-因此它不会到达异常被“映射”的点)