实例:下面注解为标识类的自定义注解,还有一类为功能性注解比如日志的注解,事务的注解等 @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"); } }