我可以在 Spring Boot 中将 Jersey 用作 servlet 和过滤器吗?

Posted

技术标签:

【中文标题】我可以在 Spring Boot 中将 Jersey 用作 servlet 和过滤器吗?【英文标题】:Can I use Jersey as both servlet and filter in Spring Boot? 【发布时间】:2016-12-04 22:17:28 【问题描述】:

根据春天documentation:

您还可以通过设置 spring.jersey.type=filter 来使用过滤器而不是 Servlet(在这种情况下,要替换或覆盖的 @Bean 是 jerseyFilterRegistration)。

根据this问题的答案:

当您想根据特定条件过滤和/或修改请求时,请使用过滤器。当您想要控制、预处理和/或后处理请求时,请使用 Servlet。

那么,如果想使用带有 Spring Boot 的 Jersey 来提供 json 内容并应用过滤器(例如检查授权和向所有响应添加标头),该怎么办?春季文档读起来就像我必须为泽西岛选择过滤器或 servlet 角色。

我可以在 Spring Boot 应用程序中同时使用 Jersey 吗?如果可以,怎么做?

【问题讨论】:

【参考方案1】:

那么,如果想将 Jersey 与 Spring Boot 一起使用,既提供 json 内容,又应用过滤器,例如检查授权和向所有响应添加标头?

这个问题真的没有多大意义。

Jersey 本身就是一个处理引擎。 servlet 容器只需要HttpServeltRequestHttpServletResponse 即可开始处理请求。这些可以作为 servlet Filter 或作为 servlet HttpServlet 获得。如果您查看主要的 Jersey servlet 容器组件ServletContainer,您会发现它都扩展了HttpServlet并且实现了Filter

因此,能够将 Jersey 配置为过滤器或 servlet 并不是 Spring Boot 所特有的;泽西岛就是这样设计的。您可以将 Jersey 配置为过滤器或 servlet没有 Spring Boot。

就过滤系统而言,Jersey 拥有自己的过滤系统,独立于任何 servlet API。但是,如果您想使用 servlet 过滤器,无论您将 Jersey 配置为过滤器还是 servlet,都没有理由不能。如果您了解 servlet 过滤器链,那么您就会知道过滤器被一个接一个地调用,然后调用 servlet。因此,如果您想添加一个过滤器并让它在 Jersey 过滤器之前执行,您可以这样做。或者,如果 Jersey 是一个 servlet,您的过滤器将在 Jersey servlet 之前调用。无论哪种方式,结果都是一样的。 Jersey 不会仅仅因为它是一个过滤器或者是一个 servlet 而改变任何处理行为。

spring 文档看起来我必须为 Jersey 选择过滤器或 servlet 角色

是的 Servlet 或过滤器。从我上面提到的应该清楚。您可以拥有多个 servlet 过滤器。过滤器一个接一个地发生。您可以添加与 Jersey 无关的过滤器。它们都通过了相同的ServletRequestServletResponse,因此它们都与相同的请求和响应进行交互。如果你想创建一个过滤器来添加标题,那就去做吧。它不需要知道任何关于泽西岛的事情。

如果您想为 auth/headers 等创建 Jersey 特定 过滤器(独立于任何 servlet 过滤器机制),您可以查看 Filters and Interceptors(您可以在this great answer)。

如果你想添加 servlet 过滤器,那么你可以在 Spring Boot 中使用FilterRegistrationBeans 来实现。

@Bean
public FilterRegistrationBean anotherFilter() 


【讨论】:

您的回复是文档中缺少的内容。感谢您的澄清。

以上是关于我可以在 Spring Boot 中将 Jersey 用作 servlet 和过滤器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在弹性beantalk中将PostgreSQL RDS连接到spring boot?

如何在 Spring Boot 中将属性注入测试类?

在eclipse中将Spring Boot应用程序导出为JAR文件

如何在 Spring Boot 中将大文件上传到 ftps 服务器?

在 spring-boot 项目中将 CSS 等静态文件放在哪里?

在 Java Spring Boot 中将 CSV 转换为 JSON 数组