基于上一篇文章登录验证中JWT的生成并下发,进行请求的拦截并对JWT进行验证,放行。
详情见上一篇:
基于springboot的jwt生成下发https://mp.csdn.net/mp_blog/creation/editor/141727904
拦截器Interceptor
spring中提供的用来动态拦截控制器中方法的执行。拦截请求,在指定的方法调用前后,根据业务需求执行一些预先设定好的任务。(只拦截spring中的资源/请求,不包括浏览器端)
定义拦截器
实现HandlerInterceptor接口,并重写其中三个方法
方法1:目标方法运行前执行,返回一个布尔值。true:拦截放行,false:拦截不放行,如果不放行,将不会访问到 login登录的接口,无任何信息
方法2:目标方法运行后执行
方法3:视图渲染完成后运行,最后执行。
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
注册配置拦截器
实现WebMvcConfigurer接口,注入已经定义好的拦截器对象,并配置拦截的规则(这里拦截所有资源/请求)
@Configuration//声明配置类
public class jjwebConfig implements WebMvcConfigurer {
@Autowired
private jjwebConfig jjwebConfig;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jjwebConfig).addPathPatterns("/**");//拦截所有资源
}
}
拦截路径:
/* :只能拦截一级路,如 /emp, /dep
/** :拦截任意级路径,如/emp/1.........
拦截器中进行JWT校验逻辑,是否放行请求
拦截逻辑
不放行的几种情况:请求头中无token信息,token解析失败。hasLength
用于判断一个字符串是否为空或只包含空格字符
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求的url
String s = request.getRequestURL().toString();
if (s.contains("login")){
log.info("放行");
return true;
}
//获取请求头中的jwt token信息
String jwt = request.getHeader("token");
//判断令牌是否存在,否则返回错误,不放行
if (!StringUtils.hasLength(jwt)){
Result.error("err_login");
return false;
}
//如果存在就进行解析,解析失败返回false
try {
JwtUtils.parseJWT(jwt);
}catch (Exception e){
log.info("解析失败");
return false;
}
log.info("放行");
return true;
}