【原创】Springboot的Filter拦截器中使用@value获取值为null

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

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

@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() {     
    } 
}

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

@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() {     
    } 
}

其中,须要注意的是:springboot

  1. @Value没法为静态属性注入值,因此须要添加set方法为其注入值;app

  2. 工具类必须添加@Component或者@Service注解,不然@Value不起做用。ide

静态方法中注入了值之后,Filter中就能够直接使用了。工具

相关文章
相关标签/搜索