java - Spring 4 中的属性在从 GenericFilterBean 扩展的类中带有 @Value

标签 java spring

好的。所以问题是当我在 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/

相关文章:

java - 如何使用现有对象作为构造函数参数在 spring 中实例化 bean

java - Spring boot - 在 Get 请求中从文件系统中抓取文件

java - 如何在 SpringBoot 中从属性文件加载嵌套键值对

java - 正确的 .tld 文件头

java - 删除除字符串最后一部分之外的所有内容?

mysql - Spring MVC + Hibernate 没有对数据库做任何事情,没有抛出异常

java - 我无法使用 Spring Security 登录

java - Java 的套接字连接数限制?

java - 无法将字符串转换为 ZonedDateTime : DateTimeParseException

java.lang.runtime异常: unable to start component