- 方法一、过滤器使用@Component注解时,@value注解可用
说明:如果使用@Component,同时将Filter通过@Configuration加入过滤链时,@value将拿不到值。
@Component
public class CorsFilter implements Filter {
@Value("${xx.security.csrf-ingores}")
private String csrfIngores;
/************解决Origin跨域 安全漏洞*************/
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
System.out.println("csrfIngores:----------------------------"+csrfIngores);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
- 方法二、配置过滤器时,将参数传入
使用@Configuration将自定义filter加入过滤链时,使用setInitParameters(Map<String, String> initParameters)方法将参数初始化到过滤器。
此方案中,如果在自定义filer中无法通过@value注解获取,因为自定义的Filter 并不是一个bean,也就是说并没有纳入到spring容器中进行管理,所以 @Value 是没办法让Spring帮我们注入进来的。
/**
* 过滤器配置
*/
@Configuration
public class FilterConfiguration {
@Value("${xx.security.csrf-ingores}")
private String csrfIngores;
private Map<String, String> initParametersMap = new HashMap<>();
/***********解决referer 安全漏洞**************/
@Bean
public FilterRegistrationBean csrfFilterRegistration() {
initParametersMap.put("csrfIngores",csrfIngores);
FilterRegistrationBean registration = new FilterRegistrationBean();
RefererCsrfFilters refererCsrfFilers = new RefererCsrfFilters();
registration.setFilter(refererCsrfFilers);
registration.setInitParameters(initParametersMap);
registration.addUrlPatterns("/*");
registration.setOrder(Integer.MIN_VALUE);
return registration;
}
}
/**
* 防止CSRF跨站请求攻击。<br>
*/
public class RefererCsrfFilters extends IngoreChecker implements Filter {
private static String csrfIngores;
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
System.out.println("csrfIngores:----------------------------"+csrfIngores);
}
@Override
public void init(FilterConfig config) throws ServletException {
csrfIngores = config.getInitParameter("csrfIngores");
}
}
- 方法三、直接在静态工具类中注入值。
……
- 方法四、Filter中加载配置文件再去读取。
可行但影响性能,毕竟这是个全局过滤器,每次请求进来都加载一下配置文件,不够优雅。