在原生Servlet开发中,经常使用过滤器filter来过滤web请求。在Spring boot中,我们可以通过拦截器HandlerInterceptor来过略web请求。HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力,可以针对Controller控制器中某些请求精准过滤,而不是拦截Servlet容器
主要步骤为
创建自定义的拦截器并实现HandlerInterceptor接口
@Component
public class IntercpterLogin implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(IntercpterLogin.class);
/**
* redis
*
* */
@Autowired
RedisTemplate redisTemplate;
/**
* token ,用户登录标识
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse res, Object o) throws Exception {
String token = request.getHeader("token");
res.setContentType("application/json;charset=utf-8");
if(token == null){
Response response = new Response();
response.setMessage("没有携带登录密钥");
response.setCode(0);
res.getWriter().write(JSONObject.toJSONString(response));
return false;
}
Claims clams = JWT.intance().parseJWT(token);
if(clams != null) {
JSONObject userInfo = JSONObject.parseObject(clams.getSubject());
User user = new User();
user.setStatus(userInfo.getString("status"));
user.setUsername(userInfo.getString("name"));
user.setUserid(Integer.parseInt(userInfo.getString("uid")));
UserContextUtil.addUser(user);
return true;
}else{
Response response = new Response();
response.setMessage("登录过期");
response.setCode(0);
res.getWriter().write(JSONObject.toJSONString(response));
return false;
}
//注意,只有返回true才会继续向下执行,返回false则取消当前请求
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
UserContextUtil.clear();
}
}创建一个类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法,将想要拦截的页面写进去。
@Configuration
public class LoginConfiguration implements WebMvcConfigurer {
/**添加拦截器*/
@Bean
public IntercpterLogin loginInterceptor(){
return new IntercpterLogin();
}
/**
* 配置请求拦截器
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> interceptorSet = new ArrayList<>();
//需要拦截的
interceptorSet.add("/user/**");
interceptorSet.add("/redirectlogin");
List<String> passSet = new ArrayList<>();
//passset里面是对不需要拦截的方法集合
passSet.add("/registe");
passSet.add("/login");
//拦截所有请求
registry.addInterceptor(loginInterceptor()).addPathPatterns(interceptorSet).excludePathPatterns(passSet);
}
/**
* 方法级别的单个参数验证开启
*/
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
}