【问题标题】:Sails.js disable cookie set for OPTIONS requestsSails.js 禁用 OPTIONS 请求的 cookie 集
【发布时间】:2017-11-22 08:03:30
【问题描述】:

我正在开发一个应用程序,它使用 Sailsjs 作为后端,在不同的服务器上使用 Angular 4 作为后端。因此,我必须启用 CORS,并且来自 Angular 应用程序的每个 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 请求。

【问题讨论】:

    标签: angular cookies cors sails.js


    【解决方案1】:

    好的,我解决了问题是sails版本0.12.14中的错误,这是目前最新的稳定版本。

    文件 lib/hooks/http/get-configured-http-middleware-fns.js 在第 88 行包含此语句

    if(!isMethodExactMatch && !isMethodImplicitMatch && disabledRouteInfo.method === '*'){

    但应该是

    if(!isMethodExactMatch && !isMethodImplicitMatch && disabledRouteInfo.method !== '*'){

    进行此更改后,我已经开始工作了。

    【讨论】:

    • 很好的发现。你应该向 Sails 团队报告这个错误。
    • 我已经在考虑了,但是他们正在开发 Sails 1.0 版,并且里面有很多变化,所以我会等待稳定版本,检查错误是否仍然存在,如果是的话我会举报
    【解决方案2】:

    对于没有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',
      ...]
    

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2018-08-13
      • 2015-12-29
      相关资源
      最近更新 更多