hapi.js Cors Pre-flight 不返回 Access-Control-Allow-Origin 标头

hapi.js Cors Pre-flight not returning Access-Control-Allow-Origin header(hapi.js Cors Pre-flight 不返回 Access-Control-Allow-Origin 标头)
本文介绍了hapi.js Cors Pre-flight 不返回 Access-Control-Allow-Origin 标头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用 (Dropzone js) 上传的 ajax 文件.它将文件发送到我的 hapi 服务器.我意识到浏览器发送了一个 PREFLIGHT OPTIONS METHOD.但我的 hapi 服务器似乎没有发送正确的响应标头,所以我在 chrome 上遇到错误.这是我在 chrome 上遇到的错误

I have an ajax file upload using (Dropzone js). which sends a file to my hapi server. I realised the browser sends a PREFLIGHT OPTIONS METHOD. but my hapi server seems not to send the right response headers so i am getting errors on chrome. here is the error i get on chrome

XMLHttpRequest cannot load http://localhost:3000/uploadbookimg. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

这是 hapi js 路由处理程序

this is the hapi js route handler

server.route({
        path: '/uploadbookimg',
        method: 'POST',
        config: {
            cors : true,
            payload: {
                output: 'stream',
                parse: true,
                allow: 'multipart/form-data'
            },
        handler: require('./books/webbookimgupload'),
        }
    });

据我了解,hapi js 应该从 Pre-fight (OPTIONS) 请求中发送所有 cors 标头.不明白为什么不是

In my understanding hapi js should send all cors headers from the Pre-fight (OPTIONS) request. Cant understand why its is not

来自 chrome 的网络请求/响应

Network request /response from chrome

**General**
Request Method:OPTIONS
Status Code:200 OK
Remote Address:127.0.0.1:3000

**Response Headers**
view parsed
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
cache-control: no-cache
vary: accept-encoding
Date: Wed, 27 Apr 2016 07:25:33 GMT
Connection: keep-alive
Transfer-Encoding: chunked

**Request Headers**
view parsed
OPTIONS /uploadbookimg HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36
Access-Control-Request-Headers: accept, cache-control, content-type
Accept: */*
Referer: http://localhost:4200/books/upload
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

提前致谢

推荐答案

hapi cors: true 是一个通配符规则,允许来自所有域的 CORS 请求,除了少数情况,包括有额外的hapi 的默认白名单之外的请求标头:

The hapi cors: true is a wildcard rule that allows CORS requests from all domains except for a few cases including when there are additional request headers outside of hapi's default whitelist:

[accept"、authorization"、content-type"、if-none-match"、origin"]

请参阅 API 文档中路由选项下的 cors 选项部分:

headers - 允许的标头的字符串数组('Access-Control-Allow-Headers').默认为 ['Accept', 'Authorization', 'Content-Type', 'If-None-Match'].

headers - a strings array of allowed headers ('Access-Control-Allow-Headers'). Defaults to ['Accept', 'Authorization', 'Content-Type', 'If-None-Match'].

additionalHeaders - 附加标头到标头的字符串数组.使用它来保留默认标题.

additionalHeaders - a strings array of additional headers to headers. Use this to keep the default headers in place.

您的问题是 Dropzone 发送了几个标题以及不在此列表中的文件上传:

Your problem is that Dropzone sends a couple of headers along with the file upload that aren't in this list:

  • x-requested-with(不在您上面的标题中,而是为我发送的)
  • 缓存控制
  • x-requested-with (not in your headers above but was sent for me)
  • cache-control

您有两个选项可以让事情正常运行,您需要在服务器或客户端上进行更改:

You have two options to get things working, you need to change something on either the server or the client:

server.route({
    config: {
        cors: {
            origin: ['*'],
            additionalHeaders: ['cache-control', 'x-requested-with']
        }
    },
    method: 'POST',
    path: '/upload',
    handler: function (request, reply) {

        ...
    }
});

选项 2 - 告诉 dropzone 不要发送那些额外的标头

通过他们的配置尚不可能,但有一个待定的 PR 允许它:https://github.com/enyo/dropzone/pull/685

这篇关于hapi.js Cors Pre-flight 不返回 Access-Control-Allow-Origin 标头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)