cookie的path不一致问题
碰到了一个问题,如果target代理地址的子path也就是pathname如果不是"/",前端的path却是"/",可能由于后端技术栈老,用的tomcat+java web,会总是给set-cookie里传递path,期望请求的path不要是"/",否则本地后端服务无法代理,导致的问题是每次发送http请求,都会创建一个新的session,sessionId都会发生变化,所以我们需要重写cookie path,保证cookie中的path一致
devServer配置
{
port: 8090,
open: true,
proxy: {
'/api': {
changeOrigin: true,
target: 'http://localhost:8080/test',
onProxyRes: handleProxyRes,
}
},
}
函数实现
function handleProxyRes(proxyRes, req, res) {
// 碰到了一个问题,如果target代理地址的子path也就是pathname如果不是"/",前端的path却是"/",
// 后端由于技术栈老,用的tomcat+java web,可能会总是给set-cookie里传递path,期望请求的path不要是"/",否则本地后端服务无法代理
// 导致的问题是每次发送http请求,都会创建一个新的session,sessionId都会发生变化
// 所以我们需要重写cookie path,保证cookie中的path一致
rewriteCookiePath(proxyRes, req, res, remoteUrl);
}
/**
* 重写cookie path
* @param {*} proxyRes
* @param {*} req
* @param {*} res
* @param {*} proxyTarget
*/
function rewriteCookiePath(proxyRes, req, res, proxyTarget) {
const cookies = proxyRes.headers["set-cookie"];
const cookieRegex = new RegExp(
"Path=" + parseCookiesPathRewrite(proxyTarget),
"i"
);
//修改cookie Path
if (cookies) {
const newCookie = cookies.map(function (cookie) {
if (cookieRegex.test(cookie)) {
return cookie.replace(cookieRegex, "Path=/");
}
return cookie;
});
//修改cookie path
delete proxyRes.headers["set-cookie"];
proxyRes.headers["set-cookie"] = newCookie;
}
}
/**
* 解析target的path,用于匹配cookie path
* @param {*} targetPath
* @returns
*/
function parseCookiesPathRewrite(targetPath) {
// 解析URL
const targetUrl = new URL(targetPath);
// 这个是后端代理地址的子路径
const pathname = targetUrl.pathname;
return pathname;
}