泽西岛和过滤器异常处理
Posted
技术标签:
【中文标题】泽西岛和过滤器异常处理【英文标题】:Jersey and Filter Exception handling 【发布时间】:2012-06-04 22:28:01 【问题描述】:我有一个配置了 Spring Security 处理身份验证的 Jersey 应用程序。 jersey-spring 包提供了在我的 web.xml 中注册为 servlet 的 SpringServlet 类。
身份验证和所有工作都按预期进行。我想知道的是如何通过 Jersey servlet 发送 AuthenticationExceptions(和其他过滤器异常),这样我就可以使用我们的 ExceptionMapper 来处理它们。
最初 SpringServlet 被配置为过滤器,但在阅读了一些内容后,我了解到 servlet 应该能够处理过滤器中抛出的异常(也许这是一个错误的理解)。将其更改为 servlet 后,我没有注意到任何行为变化,如果我跟踪 Spring Security 代码,我可以看到 HttpServletResponse 的写入位置。
我的问题:Spring Security 过滤器是否可以抛出 Jersey servlet 进程异常?
【问题讨论】:
你好 Nick,你可以发布一个 SSCCE 来展示你自己的设置吗? 是的,我会尽快添加一个小样本。 【参考方案1】:如何执行取决于您是从 Spring Security 调用 Jersey,还是从 Jersey 调用 Spring Security。
如果您从 Jersey 容器内调用 Spring Security,那么除了为适当的异常定义异常映射器之外,您不需要做任何事情。
如果您仅在客户端通过 Spring Security 过滤器时调用 Jersey,那么当客户端请求通过这些过滤器时抛出的任何异常都不会被 Jersey 捕获(因为请求尚未进入 Jersey 容器)。将异常“获取”到 Jersey 容器中的一种方法是:
-
在自定义身份验证过滤器中捕获
AuthenticationException
并调用AuthenticationFailureHandler.onAuthenticationFailure()
方法(传入异常),并确保通过不调用FilterChain.doFilter()
来中断过滤器链
配置您的AuthenticationFailureHandler
以调用您设计的Jersey 资源,该资源将检索(然后重新抛出)Spring 使用HttpServletRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION)
生成的任何异常
可能还有其他方法可以将异常“获取”到泽西岛,但这是过去对我有用的一种方法。
【讨论】:
感谢您对这个非常古老的问题的回复;问题仍然存在,但我会尽快尝试您的建议。不过,我已经有一段时间没有参与这个项目了! 问题年龄不应该阻止您回答,除非技术已经改变到问题不再相关的地步(即使那样,它可能仍然对使用遗留代码的开发人员有用)。以上是关于泽西岛和过滤器异常处理的主要内容,如果未能解决你的问题,请参考以下文章