/**
* 登录拦截器,除了登录和注册接口,其他接口想要访问必须要先登录
*/
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private SysUserService sysUserService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果不是我们的方法直接放行
//handler 可能是 RequestResourceHandler springboot 程序 访问静态资源 默认去classpath下的static目录去查询
if (!(handler instanceof HandlerInterceptor)){
return true;
}
//判断token是否为空
String token = request.getHeader("Authorization");
//打印日志
log.info("=================request start===========================");
String requestURI = request.getRequestURI();
log.info("request uri:{}",requestURI);
log.info("request method:{}",request.getMethod());
log.info("token:{}", token);
log.info("=================request end===========================");
if (StringUtils.isBlank(token)){
Result fail = Result.fail(ErrorCode.NO_LOGIN.getMsg(), ErrorCode.NO_LOGIN.getCode());
//为了让浏览器识别传过来的json
response.setContentType("application/json;charset=utf-8");
//将未登录的消息,转化为json格式
response.getWriter().println(JSON.toJSONString(fail));
return false;
}
LoginUserVo bySysUser = sysUserService.findBySysUser(token);
if (bySysUser==null){
Result fail = Result.fail(ErrorCode.NO_LOGIN.getMsg(), ErrorCode.NO_LOGIN.getCode());
//为了让浏览器识别传过来的json
response.setContentType("application/json;charset=utf-8");
//将未登录的消息,转化为json格式
response.getWriter().println(JSON.toJSONString(fail));
return false;
}
//到这登录验证成功
return true;
}
}
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
//跨域
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry ){
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")//设置允许跨域的路径
.allowedOriginPatterns("*")//设置允许跨域请求的域名
.allowCredentials(true)//是否允许证书 不再默认开启
.allowedMethods("GET", "POST", "PUT", "DELETE")//设置允许的方法
.maxAge(3600);//跨域允许时间
}
// LoginInterceptor 拦截器在mvc这里配置一下,才能使用
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截test接口,如果后续接口中需要拦截再来配置即可
// registry.addInterceptor(loginInterceptor).addPathPatterns("test");
//如果没有登录,就拦截所以的请求,除了/login登录接口和/register注册接口
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login").excludePathPatterns("/register");
}
}