我有一个简单的基于Express的Node.js Web服务器,我用它来开发JavaScript应用程序。我将服务器设置为使用node-http-proxy来代理应用程序对在不同域和端口上运行的Jetty服务器发出的API请求。这个设置一直运行良好,直到我开始遇到会话管理问题。
在身份验证后,应用程序服务器返回一个cookie,其中包含代表服务器会话的身份验证令牌。当我从我的文件系统(文件://)运行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);
答案 0 :(得分:5)
我通过手动查看响应,查看它是否为set-cookie,剪掉JSESSSIONID,将其存储在变量中,并将其作为标头传递给所有后续请求来完成您的要求。这样反向代理就像一个cookie。
enter code on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue)
答案 1 :(得分:1)
嗨@tomswift你的本地服务器运行在http协议上,但是从远程服务器接收的会话cookie带有Secure;
,如:
'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;Secure;']
如果是这样,在本地服务器响应客户端之前,从原始响应中提取set-cookie
(从远程服务器到本地服务器的响应)标头,删除Secure;
并将其余部分放入代理响应(从本地服务器到客户端的响应)标题如:
'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;']
然后客户端将自动获取会话cookie。
希望它可能会有所帮助。
答案 2 :(得分:0)
理想情况下,代理的工作就是将请求转发到目的地,并且不应该删除像cookie这样的关键标题,但如果是,我认为你应该在这里提出问题https://github.com/nodejitsu/node-http-proxy/issues。
另外你说请求标头从不包含cookie,客户端是否可能从未接收过它?
答案 3 :(得分:0)
我找到了一种通过分叉和修改node-http-proxy来实现这一点的方法。它符合我目前的目的,即开发环境。对于任何形式的认真考虑,都需要充实为更合理的解决方案。
详细信息可以在我在GitHub中提交的问题中找到:https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457
我希望对这个解决方案有一些意见,特别是如果我完全朝着错误的方向前进的话。
答案 4 :(得分:0)
我有类似的问题,即cookie没有传递给客户端。 解决方案:
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];
}
}
}
}
}