我正在开发一个应用程序,它使用Sailsjs作为后端,Angular 4作为后端在不同的服务器上使用。由于这个原因,我可以启用CORS,来自角度应用程序的每个HTTP请求都由OPTIONS请求提供,我认为这是浏览器添加的。问题是Sailsjs为此OPTIONS请求创建了cookie,但此cookie未保存在浏览器中。
因此,我的redis服务器被OPTIONS请求产生的大量cookie所淹没。我想要实现的是禁用OPTIONS请求cookie。我按照路线配置尝试了它:
'OPTIONS /*': {
cors: {
credentials: false
}
}
我的全局CORS配置如下所示:
allRoutes: true,
origin: 'http://127.0.0.1:4200',
credentials: true,
methods: 'GET,POST, PUT, DELETE, OPTIONS, HEAD'
headers: 'content-type, authorization, timeout'
securityLevel: 1
但这不起作用,服务器总是响应为OPTIONS请求设置的cookie。有关如何正确设置的想法吗?
更新 研究Sailsjs的文档我已经提出了另一种解决方案,这也是行不通的。 我已将此代码添加到会话设置中:
routesDisabled: ['OPTIONS /*']
但是这已经禁用了所有请求的会话,忽略了我只是特别想要OPTIONS请求。
答案 0 :(得分:2)
好的,我解决了问题是帆版本0.12.14
中的错误,这是目前最新的稳定版本。
文件lib/hooks/http/get-configured-http-middleware-fns.js
在第88行包含此声明
if(!isMethodExactMatch && !isMethodImplicitMatch && disabledRouteInfo.method === '*'){
但它应该是
if(!isMethodExactMatch && !isMethodImplicitMatch && disabledRouteInfo.method !== '*'){
进行此项更改后,我已经开始工作了。
答案 1 :(得分:0)
对于没有routesDisabled
选项的旧版本的用户,可以在内置的sails会话中间件前放置一个垫片。
customSession: function customSession(req, res, next) {
const noSessionRoutes = [
'/'
];
//if this is an OPTIONS request, browsers won't send a cookie, so don't create a new session
//for API routes, we also don't want to create a session and/or respond with a cookie
if (req.method.toUpperCase() === 'OPTIONS' || noSessionRoutes.includes(req.url)) {
req.session = {};
return next();
}
//this will fall back to the built-in sails session configured in session.js
else {
sails.config.http.middleware.session(req, res, next);
}
}
然后middleware.order
看起来像这样:
order: [
'cookieParser',
'customSession',
...]