记:前后端分离项目中@IgnoreToken注解的使用
一、在前后端分离项目中,有部分接口通常不需要携带token来验证就能访问。可以通过自定义注解来完成。具体做法分为以下几步:
- 创建自定义注解@IgnoreToken
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD,ElementType.TYPE})
public @interface IgnoreToken {
}
注:
注解@Target(value = {ElementType.METHOD, ElementType.TYPE})里参数含义:
①ElementType.METHOD表示注解可以放在方法上
②ElementType.TYPE 表示注解可以放在类上
- 在拦截其中进行逻辑判断,如果接口或者类上有@IgnoreToken注解,意思该接口不需要token就能访问,需要放行;
//如果接口或者类上有@IgnoreToken注解,意思该接口不需要token就能访问,需要放行
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
//先从类上获取该注解,判断类上是否加了IgnoreToken ,代表不需要token,直接放行
IgnoreToken annotation = handlerMethod.getBeanType().getAnnotation(IgnoreToken.class);
if(annotation == null){
//再从方法上获取该注解
if(method.isAnnotationPresent(IgnoreToken.class)){
//annotation = handlerMethod.getMethodAnnotation(IgnoreToken.class);
annotation = method.getAnnotation(IgnoreToken.class);
log.info("请求方法 {} 上有注解 {} ",method.getName(),annotation);
}
}
if(annotation != null){
return true;
}
- 在方法或者类上添加注解@IgnoreToken
@GetMapping("/api/getUser")
@IgnoreToken
public JsonResult<List> getUsers(){
List<MUser> users = userService.selectAll();
return new JsonResult<>(users);
}
注:如果在类跟方法上都加了@IgnoreToken,方法优先级更高;
二、设置在开发环境时,调试接口不需要携带token
- yml文件配置
#开发环境
spring:
profiles:
active: dev #开发环境
- 拦截器中配置
@Value("${spring.profiles.active}")
private String profiles;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setContentType("application/json;charset=utf-8");
//如果是开发环境,则不需要token。直接通过
if(StrUtil.isNotEmpty(profiles) && profiles.equals("dev")){
return true;
}