spring boot 编写不需要登录的注解

2019-12-17  本文已影响0人  JAVA弑云

先讲述背景,项目中有个sso登录模块,他会拦截所有的请求,如果该请求中的参数没有token或者token失效,就会直接返回需要登录的提示,但是有些查询静态数据的接口需要在登录前就需要调用,所以无法带token,之前的做法就是在yml文件中添加哪些不需要token验证的请求路径,比如/login/title.每次都得这样手工配置,很容易出现问题,所以便想出了用注解解决问题

先贴注解代码

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface NotNeedLogin {
}

注解不需要写多少内容,主要在解析注解上面,下面展示我的注解处理代码

 public String scanNotNeedLogin(){
        //获取所有的controller
        Map<String, Object> listControllerBean = applicationContext.getBeansWithAnnotation(Controller.class);
        Set<String> strings = listControllerBean.keySet();
        StringBuffer exludPath=new StringBuffer();
        for (String controllerName:strings
             ) {
            //获取对应的class
            Class<?> controllerClass = listControllerBean.get(controllerName).getClass();
            //获取一级请求路径
            RequestMapping firstAnnotation = controllerClass.getAnnotation(RequestMapping.class);
            String[] value = firstAnnotation.value();
            String firstValue = value[0];
            if(!firstValue.startsWith("/")){
                firstValue="/"+firstValue;
            }
            //获取所有方法
            Method[] methods = controllerClass.getMethods();
            //遍历
            for (Method method:methods
                 ) {
                //只有包含NotNeedLogin的注解才进行进一步处理
                if(method.isAnnotationPresent(NotNeedLogin.class)){
                    RequestMapping annotation = method.getAnnotation(RequestMapping.class);
                    String[] value1 = annotation.value();
                    String secondValue=value1[0];
                    if(!secondValue.startsWith("/")){
                        secondValue="/"+secondValue;
                    }
                    exludPath.append(firstValue+secondValue+",");
                }
            }

        }
        return exludPath.toString();
    }

然后将获取的到的exludpath放到filter处理代码中,

registration.addInitParameter("EXCLUDED_PATHS", exludpath);

即可解决问题

上一篇下一篇

猜你喜欢

热点阅读