Sails.js禁用OPTIONS请求的cookie集

时间:2017-11-22 08:03:31

标签: angular cookies cors sails.js

我正在开发一个应用程序,它使用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请求。

2 个答案:

答案 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',
  ...]