Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript http代理中间件,如何复制所有/cookie头_Javascript_Angular_Http Proxy_Browser Sync_Lite Server - Fatal编程技术网

Javascript http代理中间件,如何复制所有/cookie头

Javascript http代理中间件,如何复制所有/cookie头,javascript,angular,http-proxy,browser-sync,lite-server,Javascript,Angular,Http Proxy,Browser Sync,Lite Server,我正在使用John Papa的lite服务器和chimurai的HTTP代理中间件 作为开发服务器。 问题在于我的会话cookie,我无法持久化来自真实服务器的会话cookie。 我看到了这个解决方案: 但我看不出与我的bs-config.js有什么相似之处: var proxy = require('http-proxy-middleware'); module.exports = { port: 3003, server: { middleware: {

我正在使用John Papa的lite服务器和chimurai的HTTP代理中间件 作为开发服务器。 问题在于我的会话cookie,我无法持久化来自真实服务器的会话cookie。 我看到了这个解决方案:

但我看不出与我的bs-config.js有什么相似之处:

var proxy = require('http-proxy-middleware');

module.exports = {
    port: 3003,
    server: {
        middleware: {
            1: proxy('demo/webservice/jaxrs', {
                target: 'https://localhost:8443',
                secure: false, // disable SSL verification
                changeOrigin: true   // for vhosted sites, changes host header to match to target's host
            }),
            2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
        }
    }
};
有人知道如何合并这两者吗

更新:这是响应标题的一部分:

set-cookie:JSESSIONID=620083CD7AEB7A6CC5772AC800E673E3; Path=/appServer/webservice/jaxrs; Secure
strict-transport-security:max-age=31622400; includeSubDomains
Transfer-Encoding:chunked
更新2: 我认为我的配置应该如下所示:

var proxy = require('http-proxy-middleware');

function relayRequestHeaders(proxyReq, req) {
    Object.keys(req.headers).forEach(function (key) {
        proxyReq.setHeader(key, req.headers[key]);
    });
};

function relayResponseHeaders(proxyRes, req, res) {
    Object.keys(proxyRes.headers).forEach(function (key) {
            res.append(key, proxyRes.headers[key]);
        });
};

module.exports = {
    port: 3003,
    server: {
        middleware: {
            1: proxy('/skybox', {
                target: 'https://localhost:8443',
                secure: false, // disable SSL verification
                changeOrigin: true,   // for vhosted sites, changes host header to match to target's host
                onProxyReq: relayRequestHeaders,
                onProxyRes: relayResponseHeaders
            }),
            2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
        }
    }
};

但是现在res.append是未定义的:(

不确定本地主机:3003是如何配置的;使用或不使用
https:

假设您正在使用(不是https:); 目标中的
Secure
cookie属性可能是浏览器忽略cookie的原因

4.1.2.5.安全属性

Secure属性将cookie的范围限制为“Secure”
通道(其中“安全”由用户代理定义)。当 cookie具有安全属性,用户代理将包括 HTTP请求中的cookie,仅当请求通过
安全通道(通常为传输层安全性(TLS)上的HTTP)

资料来源:

浏览器可能会根据以下所述的算法忽略cookie:

尝试删除
安全属性
,看看这是否有帮助

尝试一下:

var cookie;
function relayRequestHeaders(proxyReq, req) {
  if (cookie) {
    proxyReq.setHeader('cookie', cookie);
  }
};

function relayResponseHeaders(proxyRes, req, res) {
  var proxyCookie = proxyRes.headers["set-cookie"];
  if (proxyCookie) {
    cookie = proxyCookie;
  }
};

它与lite server一起工作。B.Ma的回答给我一个提示,以解决我与webpack dev server的问题。webpack dev server可能在引擎盖下使用http代理中间件代理请求。该问题与httpOnly Cookie一起出现,此方法解决了该问题。 这是我在webpack.conf.js中使用的配置:

let myappSessionValidationCookie = '';

module.exports = {
    ...
    devServer: {
        publicPath: 'http://localhost:9000/',
        ...
        proxy: {
            '/api': {
                target: 'http://localhost/myapp',
                changeOrigin: true,
                onProxyReq: function (proxyReq) {
                    if (myappSessionValidationCookie) {
                        proxyReq.setHeader('cookie', myappSessionValidationCookie);
                    }
                },
                onProxyRes: function (proxyRes) {
                    const proxyCookie = proxyRes.headers['set-cookie'];
                    if (proxyCookie) {
                        myappSessionValidationCookie = proxyCookie;
                    }
                },
            },
        },
    },
});
关于配置的一些解释。我有一个后端,它在localhost/myapp/api/*下为应用程序的api提供服务,并设置一个用于身份验证的httpOnly cookie。代理未将该标头(set cookie)传输到新位置(localhost:9000/myapp/api/*)因此,浏览器没有保留该cookie,并且以下所有请求都没有该cookie,因此失败。 所有的学分都归B.Ma。非常感谢您的帖子!!!

在我的案例中设置
“cookieDomainRewrite”:“localhost”
有效。这允许浏览器正确设置Cookie,因为域将匹配

下面是React中
setupProxy.js
的完整配置:

const {createProxyMiddleware} = require('http-proxy-middleware');

module.exports = function (app) {
    app.use(
        '/api',
        createProxyMiddleware({
            target: 'http://localhost:8000',
            changeOrigin: true,
            cookieDomainRewrite: "localhost",
        })
    );
};
这是我的配置。我认为重点在于

cookieDomainRewrite: 'localhost',

您可以提供来自目标的原始响应吗?原始响应中的
set cookie
值是多少?我更新了我的原始帖子。这是会话cookie:set cookie:JSESSIONID=620083CD7AEB7A6CC5772AC800E673E3;Path=/appServer/webservice/jaxrs;secure您还可以提供正在向端口3003上的服务器发出的原始请求吗?I我使用CreateReact应用程序,当我使用代理中间件时,我只获得部分身份验证令牌(大小减小)有什么原因吗?在没有安全标志的情况下移动到http时,我确实获得了会话。这是否意味着我不能将https或安全Cookie与浏览器同步一起使用?您仍然可以。只需在浏览器同步中启用
https
选项:
browserSync({https:true});
这样,安全cookie可能不会被拒绝。感谢您的提示,它解决了我在nodejs和http代理中间件中遇到的类似问题
cookieDomainRewrite: 'localhost',