Jersey框架中除了可以使用Servlet提供的过滤器以外,还提供了自己的过滤器实现。Jersey过滤器可以分为请求过滤器和响应过滤器,本次介绍Jersey过滤器的使用,并通过使用过滤器实现客户端请求完整的响应时间记录。
请求过滤器,用于处理请求到达对应的资源服务前的业务需求. 请求过滤器的实现需要满足三个条件:
实现ContainerRequestFilter,重写filter方法使用@PreMatching @Provider注解在Application类中注册该过滤器 **请求过滤器 * Created by lxliuxuan on 2016/11/16. */ @PreMatching @Provider public class MyRequestFilter implements ContainerRequestFilter{ public void filter(ContainerRequestContext containerRequestContext) throws IOException { System.out.println("客户端请求"+containerRequestContext); } } @ApplicationPath("/") public class Application extends ResourceConfig{ public Application() { /*声明资源包所在位置 * */ packages("cn.lx.resource"); /*注册过滤器 * */ register(MyRequestFilter.class); } }从上面的代码中我们可以看到在请求过滤器中有 ContainerRequestContext对象,用于封装请求的各种参数,从这个对象中我们可以获取到客户端的请求信息,包括请求路径、请求方式、请求参数、cookie信息等。我们可以在请求过滤器中进行权限拦截、日志记录等操作。
响应过滤器,用于处理请求资源服务之后,到响应给客户端之前的业务需求. 响应过滤器的实现需要满足三个条件:
实现ContainerResponseFilterr,重写filter方法使用 @Provider注解在Application类中注册该过滤器 @Provider public class MyResponseFilter implements ContainerResponseFilter { public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException { System.out.println("服务器响应"+containerRequestContext+"---"+containerResponseContext); } } register(MyResponseFilter.class);上面介绍了请求过滤器和响应过滤器的简单的使用,下面我们通过一个小案例,来模拟下在具体项目开发中过滤器的使用。 需求: 记录客户端一次请求的完整响应时间。
1、 SpeedTime类 该类用于记录客户端每次请求过来开始的时间。
public class SpeedTime { public static ThreadLocal<Long> time = new ThreadLocal<Long>(); }2、 MyRequestFilter
PreMatching @Provider public class MyRequestFilter implements ContainerRequestFilter{ public void filter(ContainerRequestContext containerRequestContext) throws IOException { //请求开始,记录开始时间 SpeedTime.time.set(System.currentTimeMillis()); System.out.println("客户端请求"+containerRequestContext.getUriInfo().getPath()); } }3、 MyResponseFilter
4、 Application类
@ApplicationPath("/") public class Application extends ResourceConfig{ public Application() { /*声明资源包所在位置 * */ packages("cn.lx.resource"); /*注册过滤器 * */ register(MyRequestFilter.class); register(MyResponseFilter.class); } }5、 TestResource
@Path("/test") public class TestResource { @GET @Path("/filter") public Response testFilter(@QueryParam("userId") String userId){ return Response.ok().entity("success").build(); } }6、 测试 通过main方法启动程序,访问http://localhost:8080/application.wadl,可以看到控制台输出客户端请求application.wadl 服务器响应完成,花费时间766ms,再次访问时,客户端请求application.wadl,服务器响应完成,花费时间1ms。说明wadl文件会在本地生成缓存,再次访问时直接读取本地缓存数据。 访问http://localhost:8080/test/filter,控制台输出客户端请求test/filter,服务器响应完成,花费时间3ms。
通过上面案例我们完成了使用过滤器对程序的响应时间的记录,当然过滤器在开发中可以实现的功能很多,具体根据业务需求,需要大家取探索了。
Jersey系列相关源码请访问:Jersey_learing项目