当前位置:   article > 正文

注册配置拦截器Interceptor_拦截器注册

拦截器注册

什么是拦截器

  • 是一种动态拦截方法调用的机制,类似于过滤器。

  • 拦截器是Spring框架中提供的,用来动态拦截控制器方法的执行。

在拦截器当中,我们通常也是做一些通用性的操作,比如:我们可以通过拦截器来拦截前端发起的请求,将登录校验的逻辑全部编写在拦截器当中。在校验的过程当中,如发现用户登录了(携带JWT令牌且是合法令牌),就可以直接放行,去访问spring当中的资源。如果校验时发现并没有登录或是非法令牌,就可以直接给前端响应未登录的错误信息。

自定义拦截器

实现HandlerInterceptor接口,并重写其所有方法

  1. //自定义拦截器
  2. @Component
  3. public class LoginCheckInterceptor implements HandlerInterceptor {
  4. //目标资源方法执行前执行。 返回true:放行 返回false:不放行
  5. @Override
  6. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  7. System.out.println("preHandle .... ");
  8. return true; //true表示放行
  9. }
  10. //目标资源方法执行后执行
  11. @Override
  12. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  13. System.out.println("postHandle ... ");
  14. }
  15. //视图渲染完毕后执行,最后执行
  16. @Override
  17. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  18. System.out.println("afterCompletion .... ");
  19. }
  20. }

注册配置拦截器

  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3. //自定义的拦截器对象
  4. @Autowired
  5. private LoginCheckInterceptor loginCheckInterceptor;
  6. @Override
  7. public void addInterceptors(InterceptorRegistry registry) {
  8. //注册自定义拦截器对象
  9. registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
  10. }
  11. }

登录校验- Interceptor

自定义登录校验拦截器

  1. //自定义拦截器
  2. @Component //当前拦截器对象由Spring创建和管理
  3. @Slf4j
  4. public class LoginCheckInterceptor implements HandlerInterceptor {
  5. //前置方式
  6. @Override
  7. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  8. System.out.println("preHandle .... ");
  9. //1.获取请求url
  10. //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
  11. //3.获取请求头中的令牌(token)
  12. String token = request.getHeader("token");
  13. log.info("从请求头中获取的令牌:{}",token);
  14. //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
  15. if(!StringUtils.hasLength(token)){
  16. log.info("Token不存在");
  17. //创建响应结果对象
  18. Result responseResult = Result.error("NOT_LOGIN");
  19. //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
  20. String json = JSONObject.toJSONString(responseResult);
  21. //设置响应头(告知浏览器:响应的数据类型为json、响应的数据编码表为utf-8)
  22. response.setContentType("application/json;charset=utf-8");
  23. //响应
  24. response.getWriter().write(json);
  25. return false;//不放行
  26. }
  27. //5.解析token,如果解析失败,返回错误结果(未登录)
  28. try {
  29. JwtUtils.parseJWT(token);
  30. }catch (Exception e){
  31. log.info("令牌解析失败!");
  32. //创建响应结果对象
  33. Result responseResult = Result.error("NOT_LOGIN");
  34. //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
  35. String json = JSONObject.toJSONString(responseResult);
  36. //设置响应头
  37. response.setContentType("application/json;charset=utf-8");
  38. //响应
  39. response.getWriter().write(json);
  40. return false;
  41. }
  42. //6.放行
  43. return true;
  44. }

注册配置拦截器

  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3. //拦截器对象
  4. @Autowired
  5. private LoginCheckInterceptor loginCheckInterceptor;
  6. @Override
  7. public void addInterceptors(InterceptorRegistry registry) {
  8. //注册自定义拦截器对象
  9. registry.addInterceptor(loginCheckInterceptor)
  10. .addPathPatterns("/**")
  11. .excludePathPatterns("/login");
  12. }
  13. }

让login通过的话最好将路径写全。例如/admin/employee/login

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/716501
推荐阅读
相关标签
  

闽ICP备14008679号