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

时间:2016-07-30 07:51:01

标签: spring-boot jersey

根据Spring documentation

  

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

根据this问题的答案:

  

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

那么如果想使用带有Spring Boot的Jersey,既可以提供json内容,又可以应用过滤器,例如检查授权和向所有响应添加标头? spring文档读起来就像我必须选择Jersey的过滤器或servlet角色。

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

1 个答案:

答案 0 :(得分:5)

  

那么如果想使用带有Spring Boot的Jersey,既可以提供json内容,又可以应用过滤器,例如检查授权和向所有响应添加标题?

这个问题并没有多大意义。

泽西岛本身就是一个处理引擎。 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中使用FilterRegistrationBean进行此操作。

@Bean
public FilterRegistrationBean anotherFilter() {

}