我有一个配置了 Spring Security 处理身份验证的 Jersey 应用程序。 jersey-spring 包提供在我的 web.xml 中注册为 servlet 的 SpringServlet 类。
身份验证和一切都按预期工作。我想知道的是如何通过 Jersey servlet 发送 AuthenticationExceptions(和其他过滤器异常),以便我可以使用我们的 ExceptionMapper 来处理它们。
最初 SpringServlet 被配置为过滤器,但在阅读了一些内容后,我开始理解 servlet 应该能够处理过滤器中抛出的异常(也许这是一个不正确的理解)。将其更改为 servlet 后,我没有注意到任何行为变化,如果我跟踪 Spring Security 代码,我可以看到 HttpServletResponse 的写入位置。
我的问题:Spring Security 过滤器是否可能抛出 Jersey servlet 进程异常?
最佳答案
你怎么做取决于你是从 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)
可能还有其他方法可以将异常“获取”到 Jersey ,但这是过去对我有用的一种方法。
关于jakarta-ee - Jersey 和 Filter 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820485/