zoukankan      html  css  js  c++  java
  • 【原创】Springboot的Filter拦截器中使用@value获取值为null

      最近在做springboot项目时,需要使用一个Filter拦截器。在拦截器中使用@Value自动注入属性值,在本地调试没有问题,打成war包部署到tomcat中就发生获取不到值的情况,不仅是@Value,还有@Autowired应该也无法注入值。网上找了很多帖子,都说的是把Filter注册到Spring content容器内才可以用,但我依然没有测试成功。于是想了一个比较粗暴的办法--直接在静态工具类中注入值然后直接调用这个静态方法。

     原来的Filter类(tomcat无法自动获取值):

    @Slf4j
    @Component
    @WebFilter(urlPatterns={"/api/*"}, filterName="authorizationFilter")
    public class AuthorizationFilter implements Filter{
        
        @Value("${auth.appid}")
        public String appid;
    
        @Value("${auth.appsecret}")
        public String appsecret;
        
        @Override    
        public void init(FilterConfig arg0) throws ServletException {     
        } 
        
        @Override    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                throws IOException, ServletException {
             // 省略。。。
        }     
        
        @Override    
        public void destroy() {     
        } 
    }

      修改后(添加静态工具方法):

    @Component
    public class AuthUtil {
        
        public static String appid;
        
        public static String appsecret;
        
        private static final String HEADER_AUTH_BASIC = "Basic ";
        
        @Value("${auth.appid}")
        public void setAppid(String appid) {
            AuthUtil.appid = appid;
        }
        
        @Value("${auth.appsecret}")
        public void setAppsecret(String appsecret) {
            AuthUtil.appsecret = appsecret;
        }
        
        public static String getHeaderAuth() {
            String authPar = appid + ":" + MD5Util.MD5Encode(appsecret);
            return HEADER_AUTH_BASIC + Base64Utils.getBase64(authPar);
        }
    }
    @Slf4j
    @Component
    @WebFilter(urlPatterns={"/api/*"}, filterName="authorizationFilter")
    public class AuthorizationFilter implements Filter{
        
        @Override    
        public void init(FilterConfig arg0) throws ServletException {     
        } 
        
        @Override    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                throws IOException, ServletException {
            ...
            String auth = AuthUtil.getHeaderAuth();
            ...
        }     
        
        @Override    
        public void destroy() {     
        } 
    }

    其中,需要注意的是:

      1. @Value无法为静态属性注入值,所以需要添加set方法为其注入值;

      2. 工具类必须添加@Component或者@Service注解,否则@Value不起作用。

    静态方法中注入了值以后,Filter中就可以直接使用了。

    The higher I got, the more amazed I was by the view.
  • 相关阅读:
    《人月神话》阅读笔记3
    第十五周总结
    《人月神话》阅读笔记2
    对正在使用的输入法评价
    课堂练习(找水王问题)
    第二阶段冲刺第十天
    第二阶段冲刺第九天
    第二阶段冲刺第八天
    第二阶段冲刺第七天
    openwrt U盘启动
  • 原文地址:https://www.cnblogs.com/wyx312/p/9887897.html
Copyright © 2011-2022 走看看