泽西和过滤器异常处理

时间:2012-05-30 16:34:43

标签: java-ee servlets jersey jax-rs 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过滤器引发的异常?

1 个答案:

答案 0 :(得分:0)

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

如果从Jersey容器内部调用Spring Security,那么除了为相应的异常定义异常映射器之外,您不必执行任何操作。

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

  1. 在自定义身份验证过滤器中捕获AuthenticationException并调用AuthenticationFailureHandler.onAuthenticationFailure()方法(传递异常),并确保通过而不是调用{来打破过滤器链{1}}
  2. 配置您的FilterChain.doFilter()以调用您的设计的Jersey资源,该资源将使用AuthenticationFailureHandler
  3. 检索(然后重新抛出)Spring生成的任何异常

    可能还有其他方法可以将这个例外“搞”到Jersey-land,但这是过去对我有用的一种方式。