博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jersey的Filter详解
阅读量:4179 次
发布时间:2019-05-26

本文共 3194 字,大约阅读时间需要 10 分钟。

Jersey是一款实现了JAX-RS标准的RESTful Web Services开发框架。

Jersey的Filter主要用于操作HTTP请求或响应的Headers, Methods和URI等参数。而相比较,Jersey的Interceptor主要操作Entity的输入流和输出流,如对Entity输入流进行zip/unzip。

1. Filter的分类

1) 根据Filter的功能

  • 请求过滤器,操作HTTP请求的过滤器。
  • 响应过滤器,操作HTTP响应的过滤器。

2) 根据处理的位置(客户端还是服务端)

  • 服务端过滤器,过滤操作在服务端进行处理。
  • 客户端过滤器,过滤操作在客户端进行处理。

3) 根据处理的时机(仅适用于服务端请求过滤器)

请求过滤器的操作,都是发生在服务端资源尚未处理之前。但根据是否改变目标的服务端资源,还可以细分如下:

  • post-matching,默认,请求的服务端资源已经明确,在到达服务端资源之前通过过滤器操作请求。过滤器不能改变请求的资源目标。
  • pre-matching,设置@PreMatching,过滤器可以操作请求的目标,转换到服务器的其他资源。

2. Filter接口

  • ContainerRequestFilter接口,服务端请求过滤器
public void filter(ContainerRequestContext requestContext) throws IOException {...}
  • ContainerResponseFilter接口,服务端响应过滤器
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {...}

其中,requestContext是只读的,只有responseContext是可读写的。

  • ClientRequestFilter接口,客户端请求过滤器
public void filter(ClientRequestContext requestContext) throws IOException {...}
  • ClientResponseFilter接口,客户端响应过滤器
public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {...}

3. Filter的生效

在Jersey应用中,首先要将Filter实现类注册为@Provider,使JAX-RS运行时能够发现该Filter实现。

其次,在web.xml中,为ServletContainer设置初始化参数如下,包含Filter实现类所在的包com.mycompany.myapp.filters,从而对所有请求/响应生效。

Jersey Web Application
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.mycompany.myapp.resources, com.mycompany.myapp.filters

另外,如果仅想对某些请求/响应生效,可以通过声明特定的标注给出生效的范围,并将Filter实现类注册为该标注。后续服务端资源如果希望应用该Filter实现,则给该服务端资源类设置该标注即可。详见应用示例。

4. Filter的优先级

在一个Jersey应用中,如果实现了多个Filter,可以通过@javax.annotation.Priority(整数)设置优先级,确定各个Filter之间的处理顺序。

  • 对于多个请求过滤器,设置@Priority(整数),整数值小的先处理,整数值大的后处理
  • 对于多个响应过滤器,设置@Priority(整数),整数值大的先处理,整数值小的后处理

不建议随意设置优先级的整数值,而是推荐使用javax.ws.rs.Priorities类中定义的常量:

  • Priorities.AUTHENTICATION = 1000
  • Priorities.AUTHORIZATION = 2000
  • Priorities.HEADER_DECORATOR = 3000
  • Priorities.ENTITY_CODER = 4000
  • Priorities.USER = 5000

5. 应用示例

1)适用于所有请求或响应的过滤器

@Provider@Priority(Priorities.USER)public class MyFilter implements ContainerRequestFilter, ContainerResponseFilter{    @Override    public void filter(ContainerRequestContext requestContext) throws IOException {        requestContext.getMethod()        requestContext.getHeaders()        requestContext.getMediaType()        requestContext.getEntityStream()        ...    }    @Override    public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException {        responseContext.getHeaders().add("header_name", "header_value");        responseContext.getStatus()        ...    }}

注意其中@Provider的用法。

2)适用于特定请求或响应的过滤器

定义应用标注@MyFilterApplyHere

@NameBinding@Retention(RetentionPolicy.RUNTIME)public @interface MyFilterApplyHere {}

定义过滤器,这里以过滤请求为例。注意标注@MyFilterApplyHere的使用。

@Provider@MyFilterApplyHerepublic class MyFilter implements ContainerRequestFilter {    @Override    public void filter(ContainerRequestContext requestContext) throws IOException {        ...    }}

应用过滤器,仅当请求的服务端资源为/logs时,该过滤器才生效。

@Path("logs")@MyFilterApplyHerepublic class MyRestApis {...}

 

参考链接:

 

转载地址:http://hmlai.baihongyu.com/

你可能感兴趣的文章
左神算法基础班总结
查看>>
Linux性能优化
查看>>
进程间的通信---UNIX高级环境编程
查看>>
基于SSH开发的城市公交管理系统 JAVA MySQL
查看>>
基于SSH开发的勤工助学管理系统 JAVA MySQL
查看>>
基于SSH开发的宠物销售商城系统 JAVA MySQL
查看>>
基于springboot的宠物领养管理系统 java
查看>>
JAVA 洗衣房管理系统 宿舍洗衣机管理系统
查看>>
基于SSM的街道办安全管理系统 JAVA
查看>>
基于SSM的论文选题管理系统 JAVA
查看>>
生成器模式
查看>>
工厂方法模式
查看>>
阿里规范(一)关于CountDownLatch和ThreadLocalRandom的详解(带测试代码)
查看>>
Mysql 函数 STR_TO_DATE
查看>>
Commons CLI 使用介绍
查看>>
Mybatis 缓存实现原理——案例实践
查看>>
Mybatis 缓存实现原理
查看>>
怎么提升SQL查询效率
查看>>
预编译防止sql注入
查看>>
覆盖equals方法时总是要覆盖hashCode
查看>>