Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC web app中实例化筛选器时出现异常_Java_Exception_Servlets_Spring Mvc_Filter - Fatal编程技术网

Java Spring MVC web app中实例化筛选器时出现异常

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

我需要在使用SpringMVC实现的RESTful服务中启用跨源资源共享。该服务工作正常,但现在我需要从另一个域访问资源

我发现一些帖子建议在我的web应用程序中添加一个过滤器。因此,我添加了以下部分:

过滤器类

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
委托给Spring
ApplicationContext
中定义的
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>