5

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

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

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

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

4

1 回答 1

0

你如何做取决于你是从 Spring Security 调用 Jersey,还是从 Jersey 调用 Spring Security。

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

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

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

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

于 2013-08-04T14:56:11.263 回答