Jersey过滤器使用

Jersey过滤器使用

Jersey框架中除了可以使用Servlet提供的过滤器以外,还提供了自己的过滤器实现。Jersey过滤器可以分为请求过滤器和响应过滤器,本次介绍Jersey过滤器的使用,并通过使用过滤器实现客户端请求完整的响应时间记录。

ContainerRequestFilter

请求过滤器,用于处理请求到达对应的资源服务前的业务需求.
请求过滤器的实现需要满足三个条件:

  1. 实现ContainerRequestFilter,重写filter方法
  2. 使用@PreMatching @Provider注解
  3. 在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

响应过滤器,用于处理请求资源服务之后,到响应给客户端之前的业务需求.
响应过滤器的实现需要满足三个条件:

  1. 实现ContainerResponseFilterr,重写filter方法
  2. 使用 @Provider注解
  3. 在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项目

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值