泽西岛和过滤器异常处理

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) 生成的任何异常

可能还有其他方法可以将异常“获取”到泽西岛,但这是过去对我有用的一种方法。

【讨论】:

感谢您对这个非常古老的问题的回复;问题仍然存在,但我会尽快尝试您的建议。不过,我已经有一段时间没有参与这个项目了! 问题年龄不应该阻止您回答,除非技术已经改变到问题不再相关的地步(即使那样,它可能仍然对使用遗留代码的开发人员有用)。

以上是关于泽西岛和过滤器异常处理的主要内容,如果未能解决你的问题,请参考以下文章

drf过滤和排序及异常处理的包装

一文搞定 Spring Security 异常处理机制!

SpringMVC之拦截器和异常处理

MVC过滤器使用案例:统一处理异常顺道精简代码

SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

zuul网关Filter处理流程及异常处理