好的。所以问题是当我在 Debug模式下运行应用程序时,它确实进入了 enabled
的 setter 并且它被设置为 false,但是当 doFilter
被调用时 enabled
始终为真。
为了清楚起见,我删除了一些评论 ;-)。
public class CorsFilter extends GenericFilterBean {
private String allowedOrigins = "^(https?://([a-zA-Z][a-zA-Z0-9\\-]*\\.)?(local|localhost)(:[0-9]+)?$";
private boolean enabled = true;
@Value("${cors.enabled}")
public void setEnabled(String enabled) {
if (enabled != null) {
this.enabled = enabled.matches("^[ \\t]*(true|1|yes)[ \\t]*$");
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
if (isEnabled()) {
HttpServletResponse res = (HttpServletResponse) response;
HttpServletRequest req = (HttpServletRequest) request;
String requestOrigin = req.getHeader("Origin");
// ignore when origin empty or not given or not matched
if (requestOrigin != null && !requestOrigin.isEmpty() && requestOrigin.matches(getAllowedOrigins())) {
res.addHeader("Access-Control-Allow-Origin", requestOrigin);
res.addHeader("Access-Control-Allow-Credentials", "true");
res.addHeader("Access-Control-Allow-Headers", "Accept,Authorization,Origin,Content-type");
}
}
chain.doFilter(request, response);
}
public String getAllowedOrigins() {
return allowedOrigins;
}
public boolean isEnabled() {
return enabled;
}
}
在 beans.xml 中:
<bean id="CorsFilter" class="saas.web.filter.CorsFilter" />
在属性文件中:
cors.enabled=false
在 web.xml 中
<!-- CORS -->
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>saas.web.filter.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最佳答案
web 应用程序实际使用的过滤器将不是 spring 在当前配置中创建的过滤器。你必须使用 DelegatingFilterProxy使用 spring 创建的 bean。
如下所示更改 web.xml 文件中的过滤器可能会成功:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
关于java - Spring 4 中的属性在从 GenericFilterBean 扩展的类中带有 @Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24010468/