- 我们使用过滤器进行日志处理的时候,一般的过滤器的编码方式是针对所有的方法都会进行过滤,假如我们需要对用户特定别的访问行为进行监控,记录用户的访问记录,现在的过滤器的写法就不能满足我们的需求。在Jersey框架中我们可以使用特定的注解来指定过滤器的作用范围,这种特定的注解被称为名称绑定。
- 名称绑定注解
- 使用@NameBingding 注解可以定义一个运行时的自定义注解,该注解用于定义类级别以及方法级别。
-
/** 用户日志注解
* Created by Administrator on 2017/3/14.
*/
@NameBinding //用于定义一个运行时的自定义注解
@Target({ElementType.TYPE,ElementType.METHOD}) //作用范围类和方法
@Retention(value = RetentionPolicy.RUNTIME) //运行时有效
public @interface UserLog {
}
- 注解绑定过滤器
-
import cn.lx.annotation.UserLog;
import javax.annotation.Priority;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
/**具体的日志处理过滤器
* Created by Administrator on 2017/3/14.
*/
@UserLog //将过滤器与自定义注解绑定
@Provider //声明为面向切面组件
@Priority(Priorities.USER) //声明过滤器的顺序
public class LoggerFilter implements ContainerRequestFilter,ContainerResponseFilter{
//请求过滤器
public void filter(ContainerRequestContext requestContext) throws IOException {
//记录请求信息,例如请求时间 请求路径 请求参数
System.out.println("请求过滤器执行了");
}
//响应过滤器
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
//记录相应信息 例如 响应时间 响应数据 响应状态码
System.out.println("响应过滤器执行了");
}
}
-
- 资源使用注解
-
package cn.lx.resource;
import cn.lx.annotation.UserLog;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
/**
* Created by Administrator on 2017/3/14.
*/
@Path("/test")
public class TestResource {
@GET
@Path("/test1")
public String get1(){
return "test1";
}
@UserLog
@GET
@Path("/test2")
public String get2(){
return "test2";
}
}
-
- Aoolication中声明过滤器所在位置
-
@ApplicationPath("/")
public class Application extends ResourceConfig{
public Application() {
/*声明资源包所在位置
* */
packages("cn.lx.resource");
/**
* 声明过滤器所在位置
*/
packages("cn.lx.filter");
}
}
-
- 测试是否可用
- 启动项目,访问/test/test1 时日志过滤器没有起作用,访问/test/test2时日志过滤器起作用
- 名称绑定注解