如何在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
相关产品推荐
相关产品推荐

