一、场景说明
与使用ContainerRequestFilter,ContainerResponseFilter等全局性过滤器不同,在有些场景下只需对特定的XXXResource做AOP拦截,这个时候@NameBinding名称绑定可以说是一种不错的可选方案。
二、使用方法
1.1 新增注解
import javax.ws.rs.NameBinding;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@NameBinding //此处很关键
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface HelloResourceBinding {
}
1.2 编写Filter类
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 java.io.IOException;
@HelloResourceBinding
@Priority(Priorities.USER)
//@Provider
public class LogProvider implements ContainerRequestFilter, ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
System.out.println("-------");
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
System.out.println("-------");
}
}
1.3 对需要拦截的方法或类添加HelloResourceBinding注解
@Path("index")
@GET
public Response hello() {
return Response.ok("hello world!").build();
}
@Path("2")
@GET
public String hello2() {
return "helloworld";
}
@Path("3")
@GET
@HelloResourceBinding
@Produces(MediaType.APPLICATION_JSON)
public Response hello3() {
return Response.ok(new User("kk", "10")).build();
}
1.4 在ResourceConfig注册LogProvider
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
@Bean
ResourceConfig resourceConfig() {
return new ResourceConfig(HelloResource.class).register(ServiceExceptionMapper.class).register(LogProvider.class);
}
}
三、总结
1. 使用名称绑定可以应用在权限验证场景,比如只有几个Resource需要权限验证,而其他的是不需要的。
2. 对于这个还可以使用Jersey的动态绑定,读者有兴趣可以移步jersey利用filter和Dynamic binding来实现token拦截过滤请求。