先讲述背景,项目中有个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);
即可解决问题
网友评论