当前位置: 首页 > 知识库问答 >
问题:

CORS 问题:印前检查的响应具有无效的 HTTP 状态代码 403

奚飞星
2023-03-14

托管webservice应用程序的环境Tomcat服务器。网站是用SpringMVC和AngularJS搭建的。

核心问题:REST GET触发了OPTIONS请求,该请求失败。有问题的GET返回一个应用程序/JSON响应。最初,我得到的错误是:

"未能加载资源:服务器以状态403(禁止)响应

加载超文本传输协议失败://myServer: 8084/wsPRDE/navbar/getnavbartxt:响应预检请求未通过权限改造检查:请求的资源上不存在'Access-Control-Allove-Origin'标头。因此不允许访问Origin'超文本传输协议://myServer: 8080'。响应的HTTP状态代码为403。"

在出现此问题之前,我们所做的只是在控制器中@CrossOrigin。然后,httpd.conf 被设置为添加这些标头。它对所有从站点检索脚本(具有讽刺意味的是不是CORS)都这样做了,但对于实际的CORS响应却没有。当我确保在响应中返回访问控制 - 允许源,允许方法和允许标头时,通过将CORSFilter编码到Web服务中,错误更改为:

“选项 http://myServer:8084/wsPOFA/navbar/getnavbartxt 403(禁止访问)无法加载 http://myServer:8084/wsPOFA/navbar/getnavbartxt:预检响应具有无效的 HTTP 状态代码 403。”

背景:错误是以相当随机的方式检测到的。我的一个流程管理同事升级了windows 10。由于上述更新,整个网络服务失败,因为它无法达到。任何从站点本身到webapplication的请求(相同的地址,不同的端口)都会失败。我的上级(我是实习生)随后发现,在没有windows 10更新的情况下,Chrome和IE(当使用服务器别名时,而不是使用“普通”URL时)也存在同样的问题。在更新之前(或使用IE和普通URL时),GET似乎不会触发选项请求。

进一步的尝试在此之后,我尝试扩展Allow-Headers以包括GET请求/响应中存在的所有字段。我还将OPTIONS请求中的Origin与起源白名单进行比较,如果匹配,则将OPTIONS响应Allow-Origin标头值设置为请求Origin值。

因此,源匹配并且请求/响应中的所有标头都设置为允许。到目前为止,我花了3天时间阅读CORS并在网络上寻找解决方案。大多数解决方案都提到了我实现的CORS过滤器,然后有大量肮脏的变通方法,从完全清除标头到始终响应200 OK的OPTIONS请求。但它们似乎非常“肮脏”的解决方案。

有人能给我指出正确的方向吗?我应该考虑将CORS相关代码添加到我的Spring控制器中吗?将构建httpRequests的任务委托给AngularJS是我问题的症结所在吗?还是我完全朝着错误的方向思考?

共有1个答案

孔海超
2023-03-14

这个问题被否决了,可能是因为当我决定寻求帮助时,我还没有完全清醒。无论如何,我今天设法解决了这个问题。当我发布这个问题时,我已经在应用程序级别创建了一个自定义CORS过滤器。如果设置了“允许原点”和“允许方法”字段并仅应用链,则更改此过滤器以手动将选项的状态代码设置为200。非选项请求上的doFilter()解决了该问题。我有点不确定这是否是一个理想/安全的解决方案。但它是有效的。下面您可以找到所使用的完整解决方案。

web.xml:

<filter>
    <filter-name>SimpleCORSFilter</filter-name>
    <filter-class>com.ofis.webservice.CORS.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SimpleCORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

筛选器类:

package com.ofis.webservice.CORS;

import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SimpleCORSFilter implements Filter {

    ArrayList<String> AllowedOrigins;
    ArrayList<String> AllowedMethods;

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    if (request.getMethod().equals("OPTIONS")) {
        String reqOrigin;
        reqOrigin = request.getHeader("Origin");

        for (String origin : AllowedOrigins) {
            if (origin.equals(reqOrigin)) {
                response.setHeader("Access-Control-Allow-Origin", reqOrigin);
                break;
            }
        }

        String reqMethod;
        reqMethod = request.getHeader("Access-Control-Request-Method");

        for (String method : AllowedMethods) {
            if (method.equals(reqMethod)) {
                response.setHeader("Access-Control-Allow-Method", reqMethod);
            }
        }

        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "cache-control,if-modified-since,pragma,Content-Type");

        //Checks if Allow-Method and Allow-Origin got set. 200 OK if both are set.
        if(!response.getHeader("Access-Control-Allow-Method").equals("") && !response.getHeader("Access-Control-Allow-Origin").equals("")){
            response.setStatus(200);
        }
    } else {
        chain.doFilter(req, res);
    }
 类似资料:
  • 问题内容: 大家。我是Angular 2和Spring框架的新手。我正在尝试使用授权标头(基本auth)进行简单的get请求。 我正在使用Spring Boot(1.2.6.RELEASE),这也可能是相关的。我的CORS配置如下所示。 这是客户端的外观 我不断得到: XMLHttpRequest无法加载 http:// localhost:8080 / api / login?username

  • 所有人。我是Angular 2和Spring框架的新手。我正在尝试一个带有授权头(基本身份验证)的简单get请求。 我使用的是Spring Boot(1.2.6.Release),这也可能是相关的。我的CORS配置如下所示。 帮帮我,我不知道我错过了什么...我已经查了很多帖子,但都没找到。

  • 我使用作为服务器端的Spring-boot并提供一个虚拟服务进行测试 其中我的serviceCaller.java=

  • 问题内容: 我正在使用ionic框架和angularjs,我使用chrome来查看日志,但是在这里,我正在执行一个登录页面,我试图发布用户输入的数据来提供服务,但是却出现了此类错误。 而且这是 阅读一些博客后的下一个错误,我认为这是一个CORS扩展,从该扩展允许我尝试过ajax请求,但是我无法找到为什么会出现这两个错误。这是我的代码 https://plnkr.co/edit/Dz0aFsLqoQ

  • 我正在尝试使用Ajax进行REST调用(POST)。这是我的AJAX代码 最初,我得到了这个错误:XMLHttpRequest无法加载http://localhost:port/service/myservice。对preflight请求的响应未通过访问控制检查:请求的资源上没有“access-control-allow-origin”标头。因此不允许访问源“null”。响应的HTTP状态代码为4

  • 我知道这里已经有很多相同的解决问题, 但不幸的是,它们都没有帮助我:-( 这里是我的问题: 我尝试从本地主机连接到服务器上的REST服务。使用FF REST插件可以正常工作,但我的应用程序会导致以下错误: 选项 http://.../my_REST_Service/ 401 (未经授权) XMLHttpRequest 无法加载 http://.../my_REST_Service/。 印前检查的响