You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node服务器中拦截Spring Security返回的307重定向响应?

解决Node服务拦截307重定向响应的问题

问题核心在于request-promise默认会自动跟随HTTP重定向(包括307),你当前拿到的response实际是重定向目标页面的内容,而非Spring服务B返回的原始307响应。要拦截并修改该响应,需关闭自动重定向配置后手动处理:

步骤1:修改request-promise配置

在请求选项中添加followRedirect: false禁止自动跳转,同时开启resolveWithFullResponse: true获取完整响应对象(包含状态码、响应头等),这样就能捕获到服务B返回的307响应:

var socialAuthIntercept = (req, res, next) => {
  var url = loadBalancer('server-B');
  var options = {
    url: url + '/v3/login/' + req.params.authProvider,
    method: 'GET',
    headers: req.headers,
    qs: req.query,
    followRedirect: false, // 关键:关闭自动重定向
    resolveWithFullResponse: true // 获取完整响应对象(状态码、响应头等)
  };

  return request(options).then(response => {
    // 判定是否为307临时重定向响应
    if (response.statusCode === 307) {
      // 在这里修改重定向地址或其他响应内容
      let originalLocation = response.headers.location;
      // 示例:修改重定向地址中的域名或路径
      let modifiedLocation = originalLocation.replace('target-domain', 'your-custom-domain');
      
      // 向客户端返回修改后的307响应
      res.status(307).set('Location', modifiedLocation).send();
    } else {
      // 处理非307状态的正常响应
      res.status(response.statusCode).send(response.body);
    }
  }).catch(error => {
    console.error('请求服务B出错:', error);
    next(error); // 传递错误到后续错误处理中间件
  });
}

关键说明

  • followRedirect: false:阻止request-promise自动跳转,确保你能拿到服务B返回的原始307响应。
  • resolveWithFullResponse: true:默认request-promise仅返回响应体,开启后可获取包含状态码、响应头的完整响应对象,方便判断状态码和修改重定向地址。
  • 307状态码代表临时重定向,需保持状态码不变,仅修改Location响应头后再转发给客户端,这样能保留原请求的方法和请求体特性。

内容的提问来源于stack exchange,提问作者Divyansh Rajput

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:43:11