sailsjs cors 错误请求仍然通过控制器
sailsjs cors bad request still getting through to controller
所以我的 cors.js 文件看起来像
module.exports.cors = {
allRoutes: true,
origin: require('./local.js').hosts, // this is 'http://localhost'
}
然后我选择了一个随机站点来发出请求,在这种情况下:http://tools.pingdom.com/fpt/
这是我在页面上的请求和响应
$.post('http://localhost:1337/gift/create') Object {readyState: 1,
getResponseHeader: function, getAllResponseHeaders: function,
setRequestHeader: function, overrideMimeType: function…}
jquery-2.1.1.min.js:4 POST http://localhost:1337/gift/create
(index):1 XMLHttpRequest cannot load
http://localhost:1337/gift/create. The 'Access-Control-Allow-Origin'
header contains the invalid value ''. Origin
'http://tools.pingdom.com' is therefore not allowed access.
但是,我仍然在控制台中遇到错误,因为控制器函数仍然被调用。
sails> error: Sending 500 ("Server Error") response:
TypeError: Cannot read property 'email' of undefined
我认为 cors 应该在连接失败时结束连接。
我是否缺少设置?
这是此 post CORS: preflight passes, main request completes w/200, but browser still has Origin error 的副本,但似乎没有解决。我们知道为什么 post 继续通过吗?
这是响应头
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:
Connection:keep-alive
Content-Length:2
Content-Type:application/json; charset=utf-8
Date:Wed, 28 Jan 2015 15:56:51 GMT
Set-Cookie:sails.sid=s%3A5TJr82PCN-Tas2GrfKkhooEB.IWwc75iQUPRYoR7qWSep6xc%2BSLUkOV0IQe0w63GDYrQ; Path=/; HttpOnly
X-Powered-By:Sails <sailsjs.org>
没有设置访问控制允许来源。我可以为此制定政策,但这是 Sails 中的错误吗?
首先要注意的是:您永远不会遇到 500 错误,因为您应该在使用它们之前在控制器代码中验证这些字段!
至于尽管您的 CORS 设置仍在处理请求:您所看到的是预期的行为,但我理解您的困惑。以下是您必须了解的有关 CORS 和 POST 请求的内容:
POST 请求不会触发来自浏览器的预检请求,只要它们使用常见的内容类型 header,例如 application/x-www-form-urlencoded
.
这是因为长期以来,常规的旧 HTML 表格被允许自由地 POST 到不同的来源。当您执行常规 jQuery $.post
时,它使用相同的内容类型,因此服务器无法将其与常规形式 POST 区分开来并允许它通过。 浏览器,在收到空的Access-Control-Allow-Origin
header后,说"no way Jose"并拒绝显示响应,但那时船已经航行了- -POST 请求已处理。
如果您不希望 Sails 处理来自 non-whitelisted 来源的 any 请求,您可以将 CORS 配置中的 securityLevel
设置为1
(高)或2
(非常高):
module.exports.cors = {
allRoutes: true,
origin: require('./local.js').hosts, // this is 'http://localhost',
securityLevel: 1
}
这将导致 Sails return 对来自不允许的域的任何请求作出 403 响应。 high
和 very high
之间的区别是 high
仍然允许来自不同协议的 cross-origin 请求(所以你的 Postman 请求仍然有效),而 very high
紧紧锁住一切。
所以我的 cors.js 文件看起来像
module.exports.cors = {
allRoutes: true,
origin: require('./local.js').hosts, // this is 'http://localhost'
}
然后我选择了一个随机站点来发出请求,在这种情况下:http://tools.pingdom.com/fpt/
这是我在页面上的请求和响应
$.post('http://localhost:1337/gift/create') Object {readyState: 1, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function…} jquery-2.1.1.min.js:4 POST http://localhost:1337/gift/create (index):1 XMLHttpRequest cannot load http://localhost:1337/gift/create. The 'Access-Control-Allow-Origin' header contains the invalid value ''. Origin 'http://tools.pingdom.com' is therefore not allowed access.
但是,我仍然在控制台中遇到错误,因为控制器函数仍然被调用。
sails> error: Sending 500 ("Server Error") response:
TypeError: Cannot read property 'email' of undefined
我认为 cors 应该在连接失败时结束连接。
我是否缺少设置?
这是此 post CORS: preflight passes, main request completes w/200, but browser still has Origin error 的副本,但似乎没有解决。我们知道为什么 post 继续通过吗?
这是响应头
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:
Connection:keep-alive
Content-Length:2
Content-Type:application/json; charset=utf-8
Date:Wed, 28 Jan 2015 15:56:51 GMT
Set-Cookie:sails.sid=s%3A5TJr82PCN-Tas2GrfKkhooEB.IWwc75iQUPRYoR7qWSep6xc%2BSLUkOV0IQe0w63GDYrQ; Path=/; HttpOnly
X-Powered-By:Sails <sailsjs.org>
没有设置访问控制允许来源。我可以为此制定政策,但这是 Sails 中的错误吗?
首先要注意的是:您永远不会遇到 500 错误,因为您应该在使用它们之前在控制器代码中验证这些字段!
至于尽管您的 CORS 设置仍在处理请求:您所看到的是预期的行为,但我理解您的困惑。以下是您必须了解的有关 CORS 和 POST 请求的内容:
POST 请求不会触发来自浏览器的预检请求,只要它们使用常见的内容类型 header,例如 application/x-www-form-urlencoded
.
这是因为长期以来,常规的旧 HTML 表格被允许自由地 POST 到不同的来源。当您执行常规 jQuery $.post
时,它使用相同的内容类型,因此服务器无法将其与常规形式 POST 区分开来并允许它通过。 浏览器,在收到空的Access-Control-Allow-Origin
header后,说"no way Jose"并拒绝显示响应,但那时船已经航行了- -POST 请求已处理。
如果您不希望 Sails 处理来自 non-whitelisted 来源的 any 请求,您可以将 CORS 配置中的 securityLevel
设置为1
(高)或2
(非常高):
module.exports.cors = {
allRoutes: true,
origin: require('./local.js').hosts, // this is 'http://localhost',
securityLevel: 1
}
这将导致 Sails return 对来自不允许的域的任何请求作出 403 响应。 high
和 very high
之间的区别是 high
仍然允许来自不同协议的 cross-origin 请求(所以你的 Postman 请求仍然有效),而 very high
紧紧锁住一切。