本文共 3194 字,大约阅读时间需要 10 分钟。
Jersey是一款实现了JAX-RS标准的RESTful Web Services开发框架。
Jersey的Filter主要用于操作HTTP请求或响应的Headers, Methods和URI等参数。而相比较,Jersey的Interceptor主要操作Entity的输入流和输出流,如对Entity输入流进行zip/unzip。
1. Filter的分类
1) 根据Filter的功能
2) 根据处理的位置(客户端还是服务端)
3) 根据处理的时机(仅适用于服务端请求过滤器)
请求过滤器的操作,都是发生在服务端资源尚未处理之前。但根据是否改变目标的服务端资源,还可以细分如下:
2. Filter接口
public void filter(ContainerRequestContext requestContext) throws IOException {...}
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {...}
其中,requestContext是只读的,只有responseContext是可读写的。
public void filter(ClientRequestContext requestContext) throws IOException {...}
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之间的处理顺序。
不建议随意设置优先级的整数值,而是推荐使用javax.ws.rs.Priorities类中定义的常量:
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/