通过node-http-proxy保持基于cookie的会话

tom*_*ift 9 javascript proxy node.js express node-http-proxy

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

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

htt*_*ete 5

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

enter code on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue) 
Run Code Online (Sandbox Code Playgroud)