cookie的path不一致问题

7 阅读1分钟

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;
}