0%

拦截器的简单使用(登录拦截器)

在完成登陆后,后端返回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 {
//获取请求头中的token
String token = request.getHeader("token");
//判断token是否为空,如果为空也代表未登录 提醒重新登录(401)
if(!StringUtils.hasText(token)){
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
//解析token看看是否成功
try {
Claims claims = JwtUtil.parseJWT(token);
String subject = claims.getSubject();
System.out.println(subject);
} catch (Exception e) {
e.printStackTrace();
//如果解析过程中没有出现异常说明是登录状态
//如果出现了异常,说明未登录,提醒重新登录(401)
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("请求路径")