拦截器的配置多用于判断用户是否登陆,如果没有登陆就拦截,若登陆了就给予放行
这里我们用登陆拦截来做例子:
首先是编写自己的拦截器,必须要实现HandlerInterceptor 接口
/**
* 登录拦截器
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
// 注入redis
@Autowired
private RedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
// 获取请求头中携带的token
String token = request.getHeader("token");
// 从redis中获取token数据
if(!StringUtils.isEmpty(token)){ // 不为空
Object obj = redisTemplate.opsForValue().get(token);
if(obj != null){ // 判断没有过期
// 刷新redis的过期时间
redisTemplate.opsForValue().set(
token,
obj,
30,
TimeUnit.MINUTES);
// 放行
return true;
}
}
// 过期了,给前台返回信息
response.setCharacterEncoding("utf-8"); // 设置字符集
response.setContentType("application/json; charset=UTF-8");
PrintWriter writer = response.getWriter();
// 将错误信息写出,返回给前端知道
writer.write("{\"success\":false,\"message\":\"noLogin\"}");
// 关流
writer.close();
// 拦截
return false;
}
}
当然,光拥有自定义完成的拦截器还不完全,它并不能生效,因此我们还需要配置一个config配置类:
@Configuration // 相当于配置信息,配置类
public class MyConfigurer implements WebMvcConfigurer{
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加放行的路径
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login/**"); // excludePathPatterns是添加你需要放行的请求路径,可以写多个
}
}
其他的拦截思路也是一致的,只需要修改就可以使用了,需要注意的是注解的使用,自定义的拦截器必须要交给spring管理之后才能在配置类中注入使用!