Jersey使用注解和过滤器实现日志记录

时间:2022-04-05 15:54:02
  1. 我们使用过滤器进行日志处理的时候,一般的过滤器的编码方式是针对所有的方法都会进行过滤,假如我们需要对用户特定别的访问行为进行监控,记录用户的访问记录,现在的过滤器的写法就不能满足我们的需求。在Jersey框架中我们可以使用特定的注解来指定过滤器的作用范围,这种特定的注解被称为名称绑定。
    1. 名称绑定注解
      1. 使用@NameBingding 注解可以定义一个运行时的自定义注解,该注解用于定义类级别以及方法级别。
      2.         
                
        1. /** 用户日志注解
        2. * Created by Administrator on 2017/3/14.
        3. */
        4. @NameBinding //用于定义一个运行时的自定义注解
        5. @Target({ElementType.TYPE,ElementType.METHOD}) //作用范围类和方法
        6. @Retention(value = RetentionPolicy.RUNTIME) //运行时有效
        7. public @interface UserLog {
        8. }

    2. 注解绑定过滤器
      1.         
                
        1. import cn.lx.annotation.UserLog;
        2. import javax.annotation.Priority;
        3. import javax.ws.rs.Priorities;
        4. import javax.ws.rs.container.ContainerRequestContext;
        5. import javax.ws.rs.container.ContainerRequestFilter;
        6. import javax.ws.rs.container.ContainerResponseContext;
        7. import javax.ws.rs.container.ContainerResponseFilter;
        8. import javax.ws.rs.ext.Provider;
        9. import java.io.IOException;
        10. /**具体的日志处理过滤器
        11. * Created by Administrator on 2017/3/14.
        12. */
        13. @UserLog //将过滤器与自定义注解绑定
        14. @Provider //声明为面向切面组件
        15. @Priority(Priorities.USER) //声明过滤器的顺序
        16. public class LoggerFilter implements ContainerRequestFilter,ContainerResponseFilter{
        17. //请求过滤器
        18. public void filter(ContainerRequestContext requestContext) throws IOException {
        19. //记录请求信息,例如请求时间 请求路径 请求参数
        20. System.out.println("请求过滤器执行了");
        21. }
        22. //响应过滤器
        23. public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        24. //记录相应信息 例如 响应时间 响应数据 响应状态码
        25. System.out.println("响应过滤器执行了");
        26. }
        27. }
        上面需要注意的是我们需要将注解与过滤器绑定
    3. 资源使用注解
      1.         
                
        1. package cn.lx.resource;
        2. import cn.lx.annotation.UserLog;
        3. import javax.ws.rs.GET;
        4. import javax.ws.rs.Path;
        5. /**
        6. * Created by Administrator on 2017/3/14.
        7. */
        8. @Path("/test")
        9. public class TestResource {
        10. @GET
        11. @Path("/test1")
        12. public String get1(){
        13. return "test1";
        14. }
        15. @UserLog
        16. @GET
        17. @Path("/test2")
        18. public String get2(){
        19. return "test2";
        20. }
        21. }

    4. Aoolication中声明过滤器所在位置
      1.         
                
        1. @ApplicationPath("/")
        2. public class Application extends ResourceConfig{
        3. public Application() {
        4. /*声明资源包所在位置
        5. * */
        6. packages("cn.lx.resource");
        7. /**
        8. * 声明过滤器所在位置
        9. */
        10. packages("cn.lx.filter");
        11. }
        12. }

    5. 测试是否可用
      1. 启动项目,访问/test/test1 时日志过滤器没有起作用,访问/test/test2时日志过滤器起作用