最近在做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中就可以直接使用了。