Jersey——使用NameBding实现对特定类和方法拦截

本文介绍了如何在Jersey中使用NameBinding进行针对特定类和方法的拦截,而非全局过滤。通过创建注解、Filter类,将注解添加到目标方法或类,并在ResourceConfig中注册,可以实现如权限验证等场景的AOP拦截。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、场景说明
与使用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拦截过滤请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值