jakarta-ee - Jersey 和 Filter 异常处理

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

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

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

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

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

最佳答案

你怎么做取决于你是从 Spring Security 调用 Jersey,还是从 Jersey 调用 Spring Security。

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

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

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

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

    关于jakarta-ee - Jersey 和 Filter 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820485/

    相关文章:

    java - 为什么 servlet 不检索该部分?它显示 null 作为文件名

    java - 与其他 'server' 应用程序相比,servlet 的用途、重要性

    java - 注入(inject)对象时 @inject 似乎不起作用 NPE

    java - 如何设置 Context.INITIAL_CONTEXT_FACTORY?没有初始上下文异常?

    java - 转义 XML 字符的最佳实践?

    Java 导出为 XML 不起作用

    java - 无法使用 JMF 播放 mp3 流

    java - 我应该如何在我的 RESTful JAX-RS Web 服务中记录未捕获的异常?

    unit-testing - 如何在 Jersey 单元测试框架 2.5 中设置 Servlet 上下文

    java - JBoss 中枚举的每个 NetworkInterface 总是 isUp