基于注解实现拦截&自定义注解

实例:下面注解为标识类的自定义注解,还有一类为功能性注解比如日志的注解,事务的注解等


@Retention(RetentionPolicy.RUNTIME)// 注解的类型(此时为运行时)
@Target(ElementType.METHOD)//注解的目标,贴在哪里,此时定义为贴在方法上的注解(根据不同需求写不同的)
public @interface RequireLogin {
}

@Component
public class LoginIntercepter implements HandlerInterceptor {

    @Autowired
    private IUserInfoRedisService userInfoRedisService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(!(handler instanceof HandlerMethod)) {
            return true;
        }



//这一段就是基于注解的一个登陆拦截,实现的业务场景,例如:一个旅游网站,不需要登陆也可以访问很多模块,那么如果每个模块都要去配置拦截就很麻烦,有了这个注解只需要在Controller的地方贴上这个注解,在拦截器里面拿到进行判断即可
        HandlerMethod method = (HandlerMethod) handler;
       // RequireLogin annotation = method.getMethodAnnotation(RequireLogin.class);
        if(!method.hasMethodAnnotation(RequireLogin.class)) {
            return true;
        }


        String token = TokenUtils.getToken(request);
        if(StringUtils.isBlank(token)) {
            throw new AuthticationException("请先登录");
        }
        UserInfo user = userInfoRedisService.getUserByToken(token);

        if(user == null) {
            throw new AuthticationException("请先登录");
        }
        return true;
    }
}

//这个类是配置拦截器,拦截器注册了才能使用

@Configuration//此注解表示当前类可以当做配置类使用
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            //重写父类提供的跨域请求处理的接口
            public void addCorsMappings(CorsRegistry registry) {
                //添加映射路径
                registry.addMapping("/**")
                        //放行哪些原始域
                        .allowedOriginPatterns("*")
                        //是否发送Cookie信息
                        .allowCredentials(true)
                        //放行哪些原始域(请求方式)
                        .allowedMethods("GET", "POST", "PUT", "DELETE","OPTIONS")
                        //放行哪些原始域(头部信息)
                        .allowedHeaders("*")
                        //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
                        .exposedHeaders("Header1", "Header2");
            }
        };
    }

    @Autowired
    private LoginIntercepter loginIntercepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginIntercepter)
                .addPathPatterns("/**")
                .excludePathPatterns(
                        "/users/login",
                        "/users/regist",
                        "/users/sendVerifyCode",
                        "/users/checkPhone");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值