自定义拦截器
public class CheckLoginInterceptor implements HandlerInterceptor {
@Reference
private IUserInfoRedisService redisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
//获取方法
HandlerMethod handlerMethod = (HandlerMethod) handler;
//查看方法上是否贴了RequireLogin注解
if (handlerMethod.hasMethodAnnotation(RequierLogin.class)) {
//检查是否登录
String token = CookieUtil.getToken(request, "token");
String userToken = redisService.getUserToken(token);
UserInfo userInfo = JSON.parseObject(userToken, UserInfo.class);
if (userInfo == null) {
response.sendRedirect("/login.html");
return false;
}
}
}
return true;
}
}
配置拦截器需要重新写一个获取拦截器的方法,这里我直接在启动器上实现WebMvcConfigurer 接口重写addInterceptors().
在方法上面加上@Bean注解,这样就可以在checkLoginInterceptor中拿到dubbo的service对象啦
@SpringBootApplication
public class WebsiteServer implements WebMvcConfigurer {
//spring 集成拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(checkLoginInterceptor())
.addPathPatterns("/**") //拦截所有
.excludePathPatterns("/login.html")
.excludePathPatterns("/userLogin")
.excludePathPatterns("/regist.html")
.excludePathPatterns("/userRegist")
.excludePathPatterns("/css/**")
.excludePathPatterns("/images/**")
.excludePathPatterns("/js/**");
}
//拦截器的ioc
@Bean
public CheckLoginInterceptor checkLoginInterceptor() {
return new CheckLoginInterceptor();
}
public static void main(String[] args) {
SpringApplication.run(WebsiteServer.class, args);
}
}