【原創】Springboot的Filter攔截器中使用@value獲取值為null
阿新 • • 發佈:2018-11-01
最近在做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 publicvoid 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{ @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 { ... String auth = AuthUtil.getHeaderAuth(); ... } @Override public void destroy() { } }
其中,需要注意的是:
1. @Value無法為靜態屬性注入值,所以需要新增set方法為其注入值;
2. 工具類必須新增@Component或者@Service註解,否則@Value不起作用。
靜態方法中注入了值以後,Filter中就可以直接使用了。