11

我有一个简单的基于 Express 的 Node.js Web 服务器,用于开发 JavaScript 应用程序。我将服务器设置为使用 node-http-proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API 请求。在我开始遇到会话管理问题之前,此设置一直运行良好。

验证后,应用程序服务器返回一个带有代表服务器会话的验证令牌的 cookie。当我从我的文件系统 (file://) 运行 JS 应用程序时,我可以看到一旦客户端收到 cookie,它就会在所有后续 API 请求中发送。当我在节点服务器上运行 JS 应用程序并通过 node-http-proxy (RoutingProxy) 代理 API 调用时,请求标头从不包含 cookie。

我需要手动处理一些事情以通过代理支持这种类型的会话持久性吗?我一直在研究 node-http-proxy 代码,但这有点过头了,因为我是 Node 新手。

https://gist.github.com/2475547或:

var express = require('express'),
    routingProxy = require('http-proxy').RoutingProxy(),
    app = express.createServer();

var apiVersion = 1.0,
    apiHost = my.host.com,
    apiPort = 8080;

function apiProxy(pattern, host, port) {
    return function(req, res, next) {
        if (req.url.match(pattern)) {
            routingProxy.proxyRequest(req, res, {host: host, port: port});
        } else {
            next();
        }
    }
}

app.configure(function () {
    // API proxy middleware
    app.use(apiProxy(new RegExp('\/' + apiVersion + '\/.*'), apiHost, apiPort));

    // Static content middleware
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(express.static(__dirname));
    app.use(express.errorHandler({
        dumpExceptions: true, 
        showStack: true
    }));
    app.use(app.router);
});

app.listen(3000);
4

5 回答 5

5

我通过手动查看响应来完成您的要求,查看它是否是 set-cookie,剪掉 JSESSSIONID,将其存储在变量中,并将其作为标头传递给所有后续请求。这种方式反向代理充当cookie。

on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue) 
于 2015-08-29T10:54:25.213 回答
2

嗨@tomswift 您的本地服务器是否在http 协议上运行,但是从远程服务器接收的会话cookie 带有Secure;如下内容:

'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;Secure;']

如果是这样,在本地服务器响应客户端之前,set-cookie从原始响应(从远程服务器到本地服务器的响应)标头中提取,删除Secure;并将其余部分放入代理响应(从本地服务器到客户端的响应)标头中,例如:

'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;']

然后客户端将自动获取会话 cookie。

希望它可能会有所帮助。

于 2016-09-18T03:14:37.937 回答
0

理想情况下,代理的工作只是将请求转发到目的地,并且不应该剥离像 cookie 这样的关键标头,但如果是这样,我认为您应该在这里提出针对他们的问题https://github.com/nodejitsu /node-http-proxy/issues

您还说请求标头从不包含cookie,客户端是否可能从未收到它?

于 2012-04-24T02:56:26.107 回答
0

我找到了一种通过分叉和修改 node-http-proxy 来实现这一点的方法。它服务于我目前的目的,即开发环境。对于任何形式的认真考虑,都需要将其充实为更合法的解决方案。

详细信息可以在我在 GitHub 提交的问题中找到:https ://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

我会喜欢这个解决方案的一些输入,特别是如果我完全走错了方向。

于 2012-04-25T22:02:31.683 回答
0

我有类似的问题,cookie 没有传递给客户端。解决方案:

  1. 从代理响应中获取 cookie
  2. 在代理请求中设置,稍微修改值
let cookie;
const webpackConfig = {
  proxy: {
    '/api': {
        ...
        onProxyReq: (proxyReq) => {
          if(cookie) {
            proxyReq.setHeader('Cookie', cookie);
          }
        },
        onProxyRes: (proxyRes) => {
          const sc = proxyRes.headers['set-cookie'];

          const raw = sc.filter(s => s.startsWith('JSESSIONID'));

          if(raw.length) {
            cookie = raw[0].split(';')[0];
          }
        }

    }
  }
}
于 2019-04-11T20:00:00.757 回答