Jersey过滤器使用

    xiaoxiao2021-08-27  81

    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项目

    转载请注明原文地址: https://ju.6miu.com/read-677209.html

    最新回复(0)