泽西和过滤器异常处理

Nic*_*cek 5 servlets jax-rs jersey java-ee servlet-filters

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

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

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

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

max*_*der 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)

可能还有其他方法可以“获得”泽西岛的例外,但这是过去对我有用的一种方法。

  • 问题年龄永远不应该阻止您回答,除非技术已经改变到问题不再相关的程度(即使如此,它对于受制于遗留代码的开发人员可能仍然有用)。 (3认同)