在完成登陆后,后端返回token给前端保存,前端会在后续请求时将token置于请求头中,后端会对请求头中的token进行解析。如果能够正常解析,就可以证明是有完成登陆的。这里便需要使用拦截器来实现。
具体的拦截器使用在SpringMVC里面记录,这里只是记录了在SpringBoot下如何使用拦截器实现登陆后(请求头含token)才能访问特定 Handle 方法。
实现HandlerInterceptor接口
- 重写 preHandle 方法,这些方法会在Handler方法执行之前执行,以便进行前置处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Component public class LoginInterceptor implements HandlerInterceptor {
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); if(!StringUtils.hasText(token)){ response.sendError(HttpServletResponse.SC_UNAUTHORIZED); return false; } try { Claims claims = JwtUtil.parseJWT(token); String subject = claims.getSubject(); System.out.println(subject); } catch (Exception e) { e.printStackTrace(); response.sendError(HttpServletResponse.SC_UNAUTHORIZED); return false; } return true; } }
|
HandlerInterceptor接口还提供了如下的其他方法:
- postHandle方法:在Handler方法执行之后执行,我们可以在其中对域中的数据进行修改,也可以修改要跳转的页面。
- afterCompletion方法:在最后执行,这个时候已经没有办法对域中的数据进行修改,也没有办法修改要跳转的页面。我们在这个方法中一般进行一些资源的释放。
创建配置类
与跨域请求的CORS配置一样,也需要为Interceptor拦截器创建一个配置类实现WebMvcConfiger接口重写addCorsMappings方法来时为拦截器做配置。
登陆拦截器的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Configuration public class LoginConfig implements WebMvcConfigurer {
@Autowired private LoginInterceptor loginInterceptor;
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns("/**") .excludePathPatterns("/pages/login.html","/static/**") .excludePathPatterns("/sys_user/login"); } }
|
说明:
- 重写的addInterceptors方法需要传入”拦截器对象”作为参数,需要从容器中获取;
- 放行登录静态页面时,需要传入
excludePathPatterns("需要放行的页面路径,可以使用**通配","静态资源目录")
- 放行一般Handle方法的请求时,传入
excludePathPatterns("请求路径")