根据Spring documentation:
您还可以通过设置spring.jersey.type = filter来使用Filter而不是Servlet(在这种情况下,要替换或覆盖的@Bean是jerseyFilterRegistration)。
根据this问题的答案:
如果要根据特定条件过滤和/或修改请求,请使用过滤器。当您想要控制,预处理和/或后处理请求时,请使用Servlet。
那么如果想使用带有Spring Boot的Jersey,既可以提供json内容,又可以应用过滤器,例如检查授权和向所有响应添加标头? spring文档读起来就像我必须选择Jersey的过滤器或servlet角色。
我可以在Spring Boot应用程序中同时使用Jersey吗?如果是这样,怎么做?
答案 0 :(得分:5)
那么如果想使用带有Spring Boot的Jersey,既可以提供json内容,又可以应用过滤器,例如检查授权和向所有响应添加标题?
这个问题并没有多大意义。
泽西岛本身就是一个处理引擎。 servlet容器需要的只是HttpServeltRequest
和HttpServletResponse
来开始处理请求。这些既可以作为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无关的过滤器。它们都传递了相同的ServletRequest
和ServletResponse
,因此它们都与相同的请求和响应进行交互。如果要创建用于添加标头的过滤器,请执行此操作。它不需要了解泽西岛的任何信息。
如果要为auth / headers等创建 Jersey特定的过滤器(独立于任何servlet过滤器机制),您可以查看Filters and Interceptors(您可以看到一个身份验证例如this great answer)。
如果要添加 servlet 过滤器,则可以在Spring Boot中使用FilterRegistrationBean
进行此操作。
@Bean
public FilterRegistrationBean anotherFilter() {
}