我有一个简单的基于Express的Node.js web服务器,用于开发JavaScript应用程序。我将服务器设置为使用node-http-proxy代理应用程序向运行在不同域和端口上的Jetty服务器发出的API请求。在我开始遇到会话管理问题之前,这个设置一直运行得很完美。
在进行身份验证时,应用程序服务器返回一个带有代表服务器会话的身份验证令牌的cookie。当我在我的文件系统上运行JS应用程序时(file://) ),我可以看到,一旦客户端接收到cookie,它就会在所有后续的请求中发送。当我在节点服务器上运行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);发布于 2015-08-29 18:54:25
我按照您的要求手动查看了响应,查看它是否是set-cookie,截取JSESSSIONID,将其存储在一个变量中,并将其作为标头传递给所有后续请求。通过这种方式,反向代理充当cookie。
on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue) 发布于 2016-09-18 11:14:38
您的本地服务器是否在http协议上运行,但从远程服务器接收的会话cookie带有Secure;,如:
'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;Secure;']如果是,则在本地服务器响应客户端之前,从原始响应(从远程服务器到本地服务器的响应)头中提取set-cookie,删除Secure;并将其其余部分放入代理响应(从本地服务器到客户端的响应)头中,如下所示:
'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;']然后客户端将自动获取会话cookie。
希望能有所帮助。
发布于 2012-04-24 10:56:26
理想情况下,代理的工作只是将请求转发到目的地,而不应该剥离像cookies这样的关键头部,但如果是这样的话,我认为您应该在https://github.com/nodejitsu/node-http-proxy/issues上提交一个针对它们的问题。
你还说过请求头从来没有包括cookie,有没有可能客户端从来没有收到过它?
https://stackoverflow.com/questions/10291000
复制相似问题