Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
JavaSpring:否';访问控制允许原点';请求的资源上存在标头_Java_Spring_Google Chrome_Cors - Fatal编程技术网

JavaSpring:否';访问控制允许原点';请求的资源上存在标头

JavaSpring:否';访问控制允许原点';请求的资源上存在标头,java,spring,google-chrome,cors,Java,Spring,Google Chrome,Cors,我正在尝试破解一个需要CORS的项目。当我请求Java Spring Rest API时,我收到: 请求的资源上不存在“Access Control Allow Origin”标头 我的堆栈非常简单。我将JavaSpring与Tomcat一起使用。在前端,我使用jquery发出请求 我没有看到Spring对此的任何日志,也没有看到JavaSpring应用程序的调试器中显示的线程中的任何操作(这使得在被阻止的地方调试非常困难) 就我的spring资源类而言,我在类的顶部包含了跨源注释(@Cross

我正在尝试破解一个需要CORS的项目。当我请求Java Spring Rest API时,我收到:

请求的资源上不存在“Access Control Allow Origin”标头

我的堆栈非常简单。我将JavaSpring与Tomcat一起使用。在前端,我使用jquery发出请求

我没有看到Spring对此的任何日志,也没有看到JavaSpring应用程序的调试器中显示的线程中的任何操作(这使得在被阻止的地方调试非常困难)

就我的spring资源类而言,我在类的顶部包含了跨源注释(
@CrossOrigin()
)。我也尝试过在资源的方法上添加相同的注释(没有任何运气)。从长远来看,我还尝试在一个新的web.xml文件中加入一些配置,以旧式方式配置CORS过滤器:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
    <init-param>
        <param-name>cors.support.credentials</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>cors.preflight.maxage</param-name>
        <param-value>10</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

克斯菲尔特
org.apache.catalina.filters.CorsFilter
科尔斯
*
cors.methods
获取、发布、头部、选项、放置
cors.allowed.headers
内容类型、X-Requested-With、accept、Origin、访问控制请求方法、访问控制请求标头
cors.exposed.headers
访问控制允许来源,访问控制允许凭据
cors.support.credentials
真的
cors.preflight.maxage
10
克斯菲尔特
/*
我想补充的最后一个细节是,当我对前面提到的API(带有CORS注释)发出非CORS请求时,我没有看到任何返回的与允许所有或任何特定来源相关的头。这让我怀疑注释是否被什么东西阻止了


我意识到,没有太多的代码和日志,社区无法真正帮助我。我正在寻求关于如何调试这个的指导。谢谢你的帮助

有一种更简单的验证方法。您可以使用
postman
或打开F12开发者工具查看请求的响应主体(非CORS请求)。如果响应标头具有访问控制允许来源:,则表示设置成功,然后检查是否存在选项请求,因为浏览器不会直接请求该请求,但会发送选项请求以查看站点是否支持CORS。如果选项请求确实已发送,如果此请求的响应代码不是200,则会导致CORS失败,因此您只需正确响应此选项请求。

spring版本冲突就是导致此问题的原因。您可能需要检查版本。如果版本不是问题,请添加类似这样的类

@Component
public class MyCORSFilter implements Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");
chain.doFilter(req, res);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}

谢谢你的回复!我在postman中向应该接受CORS的API发出了一些请求,但在与“access control allow origin”相关的响应中没有看到任何标题。我用新发现更新了我的问题。太好了!非常感谢。