java学习基地

微信扫一扫 分享朋友圈

已有 1126 人浏览分享

为什么你写的拦截器中不能注入Java bean?

[复制链接]
1126 2
1、怎样完成阻拦器
正在Spring Boot项目中,阻拦器常常被雍么做登岸考证,日记记载等操纵。阻拦器是Spring供给的,以是能够将阻拦器注成bean,由IOC容器去办理。完成阻拦器的方法很简朴,次要由以下两个步调:
  • 捉义阻拦器类完成HandlerInterceptor接心
  • 捉义WebMvc设置类完成WebMvcConfigurer接心,增加捉义阻拦器类
扼要完成代码以下:
捉义阻拦器 LoginInterceptor:
  1. public class LoginInterceptor implements HandlerInterceptor {
  2.     @Override
  3.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  4.         String token = request.getHeader("token");
  5.         if(StringUtils.isEmpty(token)){
  6.        ...
  7.             return false;
  8.         }
  9.         return true;
  10.     }
  11. }
赶钙代码
设置捉义阻拦器:
  1. @Configuration
  2. public class WebConfiguration implements WebMvcConfigurer {
  3.     @Override
  4.     public void addInterceptors(InterceptorRegistry registry) {
  5.         registry.addInterceptor(new LoginInterceptor())
  6.              // 阻拦的恳求
  7.                 .addPathPatterns("/**")
  8.              // 不消阻拦的恳求
  9.                 .excludePathPatterns("/login");
  10.     }
  11. }
赶钙代码
那个阻拦器的次要感化便是阻拦一切会见恳求,考证所带token能否有用,当token考证胜利后,才气会见我们的营业接心。这时候候便需求供给一个考证token有用性的接心,正在阻拦器肿黹证token,因为阻拦器是Spring供给的,因而很简单念到利用@Component注解将阻拦器注成一个 bean。然后利用@Autowired注解将考证token的类注进到阻拦器停止考证。
革新完的代码以下:
考证token接心类:
  1. @Component
  2. public class TokenUtil {
  3.     /**
  4.      * 考证token 能否有用
  5.      */
  6.     public boolean checkToken(String token){
  7.         ...
  8.     }
  9. }
赶钙代码
革新完的阻拦器代码以下:
  1. @Component
  2. public class LoginInterceptor implements HandlerInterceptor {
  3.     @Autowired
  4.     private TokenUtil tokenUtil;
  5.     @Override
  6.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  7.         if(!tokenUtil.checkToken(token)){
  8.             ...
  9.             return false;
  10.         }
  11.         return true;
  12.     }
  13. }
赶钙代码
挪用接心时发明,TokenUtil并出有被注进出去!明显代码写的出成绩,为何不克不及一般注进TokenUtil呢?
认真察看我们捉义的设置类WebConfiguration,正在增加阻拦器的时分用的是new LoginInterceptor(),假如念要阻拦器见效,必需将阻拦器设置到WebMvc的设置类中,便是我们捉义的WebConfiguration类。如今增加阻拦器的时分是 new 了一个阻拦器,也便是道并未将阻拦器凸能给IOC容器,以是便没法引进Spring的bean工具
2、怎样将阻拦器凸能给IOC容器
处理成绩的思绪也很简朴,便是将阻拦器也凸能给IOC容器,如许容器内的工具就能够互相注进了。统共有以下三种方法停止处置沙脉成绩。
2.1 正在WebConfiguration注进阻拦器
阻拦器代码稳定,正在阻拦器沙鹿用@Component,同时正在WebConfiguration中利用@Autowired注解将阻拦器注进。
阻拦器代码:
  1. @Component
  2. public class LoginInterceptor implements HandlerInterceptor {
  3. }
赶钙代码
设置类代码:
  1. @Configuration
  2. public class WebConfiguration implements WebMvcConfigurer {
  3.     @Autowired
  4.     private LoginInterceptor loginInterceptor;
  5.     @Override
  6.     public void addInterceptors(InterceptorRegistry registry) {
  7.         registry.addInterceptor(loginInterceptor);
  8.     }
  9. }
赶钙代码
2.2 正在WebConfiguration将阻拦器注成bean
阻拦器无需增长@Component注解,正在WebConfiguration类中利用@Bean注解将阻拦器注成bean。
阻拦器代码:
  1. public class LoginInterceptor implements HandlerInterceptor {
  2. }
赶钙代码
设置类代码:
  1. @Configuration
  2. public class WebConfiguration implements WebMvcConfigurer {
  3.     @Bean
  4.     public LoginInterceptor loginInterceptor(){
  5.         return new LoginInterceptor();
  6.     }
  7.     @Override
  8.     public void addInterceptors(InterceptorRegistry registry) {
  9.         registry.addInterceptor( loginInterceptor());
  10.     }
  11. }
赶钙代码
2.3 经由过程机关器处置
思绪实邻WebConfiguration类中注进需求狄组证token的营业类,然后正在初初化阻拦器的时分将营业类经由过程机关器带进阻拦器中,如许便不消把阻拦器注成Spring Bean工具了。
阻拦器代码:
  1. public class LoginInterceptor implements HandlerInterceptor {
  2.     private TokenUtil tokenUtil;
  3.     public LoginInterceptor(TokenUtil tokenUtil) {
  4.         this.tokenUtil = tokenUtil;
  5.     }
  6. }
赶钙代码
设置类代码:
  1. @Configuration
  2. public class WebConfiguration implements WebMvcConfigurer {
  3.     @Autowired
  4.     private TokenUtil tokenUtil;
  5.     @Override
  6.     public void addInterceptors(InterceptorRegistry registry) {
  7.         registry.addInterceptor(new LoginInterceptor(tokenUtil));
  8.     }
  9. }
赶钙代码
3、总结
网上闭于阻拦器的代码根本皆是经由过程new一个阻拦器停止设置的,这时候候便会呈现没法注进其他bean的状况。许多人念固然天间接正在阻拦器减@Component注解使其成为一个bean工具。那是一种毛病的做法。我们需求包管的是正在WebMvc设置类中增加的阻拦器是Spring 的一个bean工具,也便是道我们需求将阻拦器注成一个bean,同时将那个bean增加的WebMvc设置类中。

举报 使用道具

回复

评论 2

旧情缘  vip年度会员  发表于 2020-12-22 19:03:56 | 显示全部楼层
求沙发

举报 使用道具

回复
雪中无处寻  vip终身会员  发表于 2020-12-22 19:42:30 | 显示全部楼层
顶一下!

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

138

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-3-1 06:29 , Processed in 0.562500 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.