Cookies 使用grunt connect代理时重写cookie路径

Cookies 使用grunt connect代理时重写cookie路径,cookies,proxy,grunt-connect-proxy,Cookies,Proxy,Grunt Connect Proxy,在开发过程中,我使用grunt connect代理使一些远程API在本地可用。这很好,只是我使用的重写规则不适用于cookie: 代理:[{ 上下文:'/publicPath',, 主机:“localhost”, 端口:8080, 重写:{ “^/publicPath”:“/privatePath” } }] 如果远程API使用路径/privatePath设置cookie,则必须将其重写为/publicPath 例如,当使用ApacheHTTPD时,我会使用-指令。如何使用grunt conn

在开发过程中,我使用grunt connect代理使一些远程API在本地可用。这很好,只是我使用的重写规则不适用于cookie:

代理:[{
上下文:'/publicPath',,
主机:“localhost”,
端口:8080,
重写:{
“^/publicPath”:“/privatePath”
}
}]
如果远程API使用路径
/privatePath
设置cookie,则必须将其重写为
/publicPath

例如,当使用ApacheHTTPD时,我会使用-指令。如何使用grunt connect proxy完成此操作?

多亏我设法解决了这个问题。我创建了以下中间件:

函数重写setcookie(请求、恢复、下一步){
var isProxyRequest=req.url.lastIndexOf('/publicPath',0)==0;
如果(isProxyRequest){
//我们拦截writeHead函数,以便在写入头之前交换头
var oldWriteHead=res.writeHead;
res.writeHead=函数(){
var cookie=res.getHeader('Set-cookie');
如果(cookie){
res.setHeader('Set-Cookie',Cookie.map(函数(项)){
//替换所有cookie中的路径。在某些情况下,简单的字符串/替换方法可能太幼稚,因此在复制和粘贴之前请检查
返回项。替换(/\/privatePath/,'/publicPath');
}));
}
oldWriteHead.apply(res,arguments);
};
}
next();
}
这里的完整配置仅供参考,以便您了解如何使用中间件:

连接:{
服务器:{
选项:{
主机名:“localhost”,
base:'myBaseDir',
开放:是的,
中间件:功能(连接、选项){
if(!Array.isArray(options.base)){
options.base=[options.base];
}
//设置代理
var middleware=[rewriteSetCookie,proxysippet];
//^^^^^^^^^^^^^^^^^^^^^^^^^^-这里是使用!
//提供静态文件。
options.base.forEach(函数(基){
中间件。推送(连接。静态(基础));
});
//使目录可浏览。
var directory=options.directory | | options.base[options.base.length-1];
push(connect.directory(directory));
退货;
}
},
代理:[{
上下文:'/publicPath',,
主机:“localhost”,
端口:8080,
重写:{
“^/publicPath”:“/privatePath”
}
}]
}
}
多亏了我的努力,我终于找到了答案。我创建了以下中间件:

函数重写setcookie(请求、恢复、下一步){
var isProxyRequest=req.url.lastIndexOf('/publicPath',0)==0;
如果(isProxyRequest){
//我们拦截writeHead函数,以便在写入头之前交换头
var oldWriteHead=res.writeHead;
res.writeHead=函数(){
var cookie=res.getHeader('Set-cookie');
如果(cookie){
res.setHeader('Set-Cookie',Cookie.map(函数(项)){
//替换所有cookie中的路径。在某些情况下,简单的字符串/替换方法可能太幼稚,因此在复制和粘贴之前请检查
返回项。替换(/\/privatePath/,'/publicPath');
}));
}
oldWriteHead.apply(res,arguments);
};
}
next();
}
这里的完整配置仅供参考,以便您了解如何使用中间件:

连接:{
服务器:{
选项:{
主机名:“localhost”,
base:'myBaseDir',
开放:是的,
中间件:功能(连接、选项){
if(!Array.isArray(options.base)){
options.base=[options.base];
}
//设置代理
var middleware=[rewriteSetCookie,proxysippet];
//^^^^^^^^^^^^^^^^^^^^^^^^^^-这里是使用!
//提供静态文件。
options.base.forEach(函数(基){
中间件。推送(连接。静态(基础));
});
//使目录可浏览。
var directory=options.directory | | options.base[options.base.length-1];
push(connect.directory(directory));
退货;
}
},
代理:[{
上下文:'/publicPath',,
主机:“localhost”,
端口:8080,
重写:{
“^/publicPath”:“/privatePath”
}
}]
}
}

我从来没有得到过饼干。我不明白为什么。我正在代理一个jboss服务器,它保存着我的RESTAPI。但是设置cookie永远不会设置。我的连接头在代理和jboss之间总是=“close”,这就是为什么从来没有设置cookie的原因吗?@Viktorerikson:连接头与cookie完全无关。从这一点信息很难说你的问题是什么。创建一个新问题,深入分析你正在尝试做什么,实际发生了什么,以及到目前为止你试图解决什么。我从来没有得到一块饼干。我不明白为什么。我正在代理一个jboss服务器,它保存着我的RESTAPI。但是设置cookie永远不会设置。我的连接头在代理和jboss之间总是=“close”,这就是为什么从来没有设置cookie的原因吗?@Viktorerikson:连接头与cookie完全无关。从这一点信息很难说你的问题是什么。创建一个新问题,深入分析你正在尝试做什么,实际发生了什么,以及