【原創】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中就可以直接使用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM