【问题标题】:Jersey and Filter Exception handling泽西岛和过滤器异常处理
【发布时间】:2012-06-04 22:28:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你好 Nick,你可以发布一个 SSCCE 来展示你自己的设置吗?
  • 是的,我会尽快添加一个小样本。

标签: jakarta-ee servlets jersey jax-rs servlet-filters


【解决方案1】:

如何执行取决于您是从 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) 生成的任何异常

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

【讨论】:

  • 感谢您对这个非常古老的问题的回复;问题仍然存在,但我会尽快尝试您的建议。不过,我已经有一段时间没有参与这个项目了!
  • 问题年龄不应该阻止您回答,除非技术已经改变到问题不再相关的地步(即使那样,它可能仍然对使用遗留代码的开发人员有用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多