Jersey过滤器使用
Jersey框架中除了可以使用Servlet提供的过滤器以外,还提供了自己的过滤器实现。Jersey过滤器可以分为请求过滤器和响应过滤器,本次介绍Jersey过滤器的使用,并通过使用过滤器实现客户端请求完整的响应时间记录。
ContainerRequestFilter
请求过滤器,用于处理请求到达对应的资源服务前的业务需求.
请求过滤器的实现需要满足三个条件:
- 实现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信息等。我们可以在请求过滤器中进行权限拦截、日志记录等操作。
ContainerResponseFilter
响应过滤器,用于处理请求资源服务之后,到响应给客户端之前的业务需求.
响应过滤器的实现需要满足三个条件:
- 实现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项目