2012-04-24 74 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。

希望它可以幫助。