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

对OPTIONS的POST更改对预检请求的响应未通过权限改造检查:没有“访问控制-允许-起源”标头

谭嘉容
2023-03-14

无法加载XMLHttpRequesthttp://xxx.xxx.对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。因此,不允许访问源“null”。响应的HTTP状态代码为500。

我试图用ajax发送一个xml肥皂,但给了我那个错误。我尝试了很多选项,但似乎都不起作用,这是代码:

var soapMessage =
                '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://xxx.xxx/">'+
                '<soapenv:Header/>'+
                '<soapenv:Body>'+
                   '<wsdl:test1>'+
                      '<PUI>12345</PUI>'+
                   '</wsdl:test1>'+
               ' </soapenv:Body>'+
             '</soapenv:Envelope>';

            $.ajax({
                url: 'http://xxx.xxx', 
                type: 'POST',
                dataType: 'xml', 
                data: soapMessage, 
                crossDomain: true,
                processData: false,
                contentType: 'text/xml; charset=\"utf-8\"',
                headers: {
                    SOAPAction: "http://xxx.xxx"
                },
                success: function (msg, data) {
                    alert(msg);

                },
                error: function (msg, data) {
                    alert("Error");
                }
            });

我做错了什么?我发送了一个POST操作,但它将其作为选项读取。如何修复此问题?

我使用Boomerang Rest和Soap客户端来测试这个服务,它给了我正确的响应。当我像上面那样使用自己的程序时,它会给我无法加载的XMLHttpRequesthttp://xxxxx“错误。我正在使用apache tomcat 6.0并使用Java web应用程序编写代码

共有2个答案

松波
2023-03-14

我的工作是编写一个过滤器,将源作为可接受的源附加到任何选项请求上,并将其添加到需要接受此类请求的任何servlet中。这是我的实现:

public class CorsFilter implements Filter {

    private static List<String> validServers = Arrays.asList([you need to fill this in with whatever sites you want to allow access]);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest instanceof HttpServletRequest) {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            String origin = request.getHeader("Origin");
            if (StringUtils.isNotBlank(origin)) { //this is a cors request
                boolean hasPrefix = origin.contains("/");
                boolean hasPort = origin.contains(":");
                String serverAlias = origin.substring(hasPrefix ? origin.lastIndexOf("/") + 1 : 0, hasPort ? origin.lastIndexOf(":") : origin.length());
                if (validServers.contains(serverAlias)) {
                    response.setHeader("Access-Control-Allow-Credentials", "true");
                    response.setHeader("Access-Control-Allow-Methods", "OPTIONS, POST, GET, PUT, DELETE");
                    response.setHeader("Access-Control-Allow-Origin", origin);
                    response.setHeader("Access-Control-Allow-Headers", "Content-Type");
                    //credentials are not sent on options requests, kick out here so that the access control headers and nothing else can be returned
                    if ("OPTIONS".equals(request.getMethod())) {
                        response.setStatus(200);
                        return;
                    }
                } else {
                    response.sendError(HttpStatus.SC_FORBIDDEN);
                    response.flushBuffer();
                    return;
                }
            }
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }


    @Override
    public void destroy() {
    }
}
朱鸿畅
2023-03-14

您正在执行跨源请求,因此您向其发出请求的服务器必须发送一个“Access Control Allow origin”响应标头,以指示它允许跨源请求。

看见https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS有关详细信息。

出于安全原因,浏览器限制从脚本中发起的跨源HTTP请求。例如,XMLHttpRequest和Fetch遵循主域同源策略。因此,使用XMLHttpRequest或Fetch的Web应用程序只能向其自己的域发出HTTP请求。

发生OPTIONS请求的原因是,当您发送带有Content-Type标头的跨源请求时,该标头的值不是Application/x-www-form-urlencodedmultipart/form-datatext/平原,您的浏览器首先进行CORS预检。

您的请求发送Content-Type: text/xml; charset="utf-8",因此会导致预飞行。

就解决方法而言,如果您向其发送请求的服务器不是您可以控制和配置的服务器,您可以使用开放式反向代理,如https://cors-anywhere.herokuapp.com/.

它的工作方式是,不要直接将请求发送到http://xxx.xxx,您可以将其发送到https://cors-anywhere.herokuapp.com/http://xxx.xxx这将代理您的请求,并使用Access Control Allow Origin和其他预期的CORS标头进行响应。

当然,您需要意识到,如果您的请求包含任何凭据,那么您将向任何地方的cors维护人员公开这些凭据。herokuapp。com。

 类似资料:
  • 我使用nodejs服务器、express框架和fetch库将请求发送到另一个位于不同域的服务器。对于我的一个endpoint,请考虑(localhost:8080/login),当用户单击登录按钮时,我正在呈现ejs文件,我正在向另一个域中的不同服务器(https://otherserver.com/login)发送获取请求。我无法发送此请求。我收到此错误: 飞行前请求的响应未通过访问控制检查:请

  • 选项https://dev-01-api-apptracker2/管理员401(未经授权) 从源https://dev-01-web-apptracker2在'https://dev-01-api-apptracker2/Admin'访问XMLHttpRequest'已被CORS策略阻止:对起飞前请求的响应不通过权限改造检查:请求的资源上不存在'Access-Control-允许-Origin'标

  • 问题内容: 我在使用ngResource调用Amazon Web Services上的REST API时遇到此错误: XMLHttpRequest无法加载 http://server.apiurl.com:8000/s/login?login=facebook。对预检请求的响应未通过访问控制检查:在所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访

  • 我正在尝试将Laravel社交名流集成到我的项目中,我遇到了以下错误 在'访问XMLHttpRequesthttps://github.com/login/oauth/authorize?client_id=6b87b76a942a90caec24 问题是当我按使用 github 按钮登录时,出现上述错误 错误图片 科尔斯.php文件 am使用水果蛋糕/laravel-cors包 我哪里做错了?

  • 问题内容: 我在使用ngResource调用Amazon Web Services上的REST API时遇到此错误: XMLHttpRequest无法加载http://server.apiurl.com:8000/s/login?login=facebook。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“h

  • 我正在尝试用php后端和React JS前端构建一个简单的API。为此,我使用了两个单独的docker容器(api.dev.de和react.dev.de,因为这是一个要求。我使用的是一个稍微经过调整的nginx代理版本。然而,当我将每个react fetch()的请求发送到服务器时,我得到了错误: CORS策略已阻止从源https://react.dev.de获取https://api.dev.