泽西岛和过滤器异常处理



我有一个配置了 Spring Security 处理身份验证的泽西岛应用程序。jersey-spring软件包提供了在我的web中注册的SpringServlet类.xml作为一个servlet。

身份验证和所有工作都按预期工作。我想知道的是如何通过 Jersey servlet 发送 AuthenticationExceptions(和其他过滤器异常),这样我就可以使用我们的 ExceptionMapper 来处理它们。

最初 SpringServlet 被配置为过滤器,但在做了一些阅读之后,我开始理解 servlet 应该能够处理过滤器中抛出的异常(也许这是一个不正确的理解)。在将其更改为 servlet 后,我没有注意到行为有任何变化,如果我跟踪 Spring 安全代码,我可以看到 HttpServletResponse 的编写位置。

我的问题:是否可以让 Spring Security 过滤器抛出 Jersey servlet 进程异常?

如何执行此操作取决于您是从 Spring Security 调用 Jersey,还是从 Jersey 调用 Spring Security。

如果你从 Jersey 容器内部调用 Spring Security,那么除了为适当的异常定义一个异常映射器之外,你不需要做任何事情。

如果仅在客户端通过 Spring Security 过滤器后调用 Jersey,则客户端请求通过这些过滤器时引发的任何异常都不会被 Jersey 捕获(因为请求尚未进入 Jersey 容器)。将异常"获取"到 Jersey 容器中的一种方法是:

  1. 捕获自定义身份验证筛选器中的AuthenticationException并调用 AuthenticationFailureHandler.onAuthenticationFailure() 方法(传入异常),并确保通过不调用FilterChain.doFilter()来中断筛选器链
  2. 配置您的AuthenticationFailureHandler以调用您设计的泽西岛资源,该资源将检索(然后重新抛出)Spring 生成的任何异常,并带有HttpServletRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION)

可能还有其他方法可以将例外"获取"到泽西岛,但这是过去对我有用的一种方式。

最新更新