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.