2012-04-24 70 views
8

我有一个简单的基于Express的Node.js Web服务器,用于开发JavaScript应用程序。我将服务器设置为使用node-http-proxy来代理应用程序对运行在不同域和端口上的Jetty服务器的API请求。直到我开始遇到会话管理问题时,此设置一直在完美运行。坚持基于cookie的会话通过节点http代理

验证后,应用程序服务器会返回一个带有代表服务器会话的验证令牌的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); 

回答

5

我通过手动查看响应,查看它是否为set-cookie,删除JSESSSIONID,将其存储在变量中,并将其作为标题传递给所有后续请求,从而做了你所要求的。这样反向代理就像一个cookie。

enter code on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue) 
0

理想代理的工作是只是前进至目的地的请求,并且不应该剥离像饼干关键的头,但如果是这样,我想你应该提交这里对他们的问题https://github.com/nodejitsu/node-http-proxy/issues

另外你说的请求标题永远不会包含cookie,是否有可能客户端从未收到它?

+0

我已在Web Inspector中确认客户端收到'set-cookie'标头。你可以在这里看到交易(http://i.imgur.com/VQV0a.png)。在这种情况下,请求cookie是由Express的cookieParser生成的,我试图用它来支持会话,但它似乎总是做它自己的事情。 – tomswift 2012-04-24 20:29:24

+0

在GitHub中打开了一个问题,因为我努力尝试从代理服务器的响应中获取cookie并手动支持会话:https://github.com/nodejitsu/node-http-proxy/issues/236 – tomswift 2012-04-24 20:46:59

0

我找到了一种通过分叉和修改node-http-proxy来实现这个功能的方法。它服务于我目前的开发环境。对于任何形式的认真考虑,它都需要充实到更合理的解决方案中。 https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

我喜欢这个解决方案的一些输入,特别是如果我在错误的方向前进彻底:

的细节可以在我的GitHub上提出的问题被发现。

0

喜@tomswift没有HTTP协议的本地服务器上运行,但会话cookie从远程服务器接收携带与Secure;,如:

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

如果是这样,您的本地服务器响应之前客户端,提取从原始响应set-cookie(响应从远程服务器到本地服务器)报头,取出Secure;,并把它的其余部分到所述代理响应(从本地服务器到客户端的响应)报头,如:

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

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

希望它可以帮助。