Java Spring MVC web app中实例化筛选器时出现异常
我需要在使用SpringMVC实现的RESTful服务中启用跨源资源共享。该服务工作正常,但现在我需要从另一个域访问资源 我发现一些帖子建议在我的web应用程序中添加一个过滤器。因此,我添加了以下部分: 过滤器类Java Spring MVC web app中实例化筛选器时出现异常,java,exception,servlets,spring-mvc,filter,Java,Exception,Servlets,Spring Mvc,Filter,我需要在使用SpringMVC实现的RESTful服务中启用跨源资源共享。该服务工作正常,但现在我需要从另一个域访问资源 我发现一些帖子建议在我的web应用程序中添加一个过滤器。因此,我添加了以下部分: 过滤器类 package org.canvassservice.filters; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; impo
package org.canvassservice.filters;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
public class CorsFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
response.addHeader("Access-Control-Allow-Origin", "*");
if (request.getHeader("Access-Control-Request-Method") != null
&& "OPTIONS".equals(request.getMethod())) {
// CORS "pre-flight" request
response.addHeader("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE");
response.addHeader("Access-Control-Allow-Headers",
"X-Requested-With,Origin,Content-Type, Accept");
}
filterChain.doFilter(request, response);
}
}
在web.xml中
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.springframework.web.filter.OncePerRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我解决了用具体实现替换filter类的问题:
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.canvassservice.filters.CorsFilter</filter-class>
</filter>
克斯菲尔特
org.canvasservice.filters.CorsFilter
我还从application.context
文件中删除了bean声明
我不知道这是否是解决此问题的最佳方法,但它是有效的。如果您指定
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.springframework.web.filter.OncePerRequestFilter</filter-class>
</filter>
容器将实例化一个CorsFilter
实例并将其注册为过滤器
。但是,您将无法利用Spring的生命周期事件和注入,因为该实例不是Spring管理的bean
相反,如果您需要所有的设置魔法,您可以使用。DelegatingFilterProxy
委托给SpringApplicationContext
中定义的Filter
bean
您可以使用名为targetBeanName的筛选器
来指定要委托到的bean的id。如果您不指定它,它将使用
中定义的名称。这不会在筛选器中提供IOC可用性,请使用
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
克斯菲尔特
org.springframework.web.filter.DelegatingFilterProxy
所以应该CorsFilter
扩展DelegatingFilterProxy
,而不是OncePerRequestFilter
?@davioooh不。保持原样。只需指定bean的名称。现在我得到了一个新的异常GRAVE:exception starting filter corsFilter org.springframework.beans.factory.nosuchbean定义异常:没有定义名为“corsFilter”的bean
。注意,我在我的应用程序.context
@davioooh中声明了过滤器bean。你能发布web.xml
的其余部分吗?我想它可能是在错误的上下文中出现的。你是对的,我在错误的上下文中声明了我的bean!非常感谢你!
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.canvassservice.filters.CorsFilter</filter-class>
</filter>
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.springframework.web.filter.OncePerRequestFilter</filter-class>
</filter>
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.canvassservice.filters.CorsFilter</filter-class>
</filter>
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>