Angular 4结合Spring 4 MVC:HTTP重定向及请求头修改技术问询
Angular 4 + Spring 4 MVC:带自定义请求头的HTTP重定向实现分析与优化
Hey there, let's break down your code and figure out if it meets your requirement for HTTP redirection with modified headers when using Angular 4 and Spring 4 MVC.
你的现有代码存在的核心问题
首先直接说结论:你的当前代码无法实现带自定义请求头的HTTP重定向,核心原因是浏览器的同源策略和重定向机制限制:
- 当服务器返回3xx系列重定向响应时,浏览器会自动发起新请求到目标URL,但会自动丢弃你在初始请求中设置的自定义请求头(仅少数标准安全头会被保留)。
- 另外,代码里存在一处逻辑不一致:你手动创建了
headers变量,但options里却调用了this.getHeadersForCDRedirection(),这可能导致实际发送的请求头和预期不符。
调整优化方案
要实现带自定义头的重定向效果,需要结合Angular代码调整和Spring后端配置,下面是具体可行方案:
1. 方案一:避免浏览器自动重定向,手动处理(推荐)
让后端返回完整响应内容而非重定向状态码,或者在Angular中捕获重定向响应,手动发起新请求并携带自定义头:
// 修正Angular代码:统一headers使用,添加observe: 'response'以获取完整响应 const params = new HttpParams().set('noCache', new Date().getTime().toString()); // 确保getHeadersForCDRedirection()返回了你需要的所有头信息:Content-Type、Accept等 const options = { headers: this.getHeadersForCDRedirection(), params: params, observe: 'response' // 关键:获取完整响应对象,包括状态码和响应头 }; const url = 'abc.htm'; this.httpClient.get(url, options).subscribe( response => { // 检测是否为重定向响应 if (response.status >= 300 && response.status < 400) { const redirectUrl = response.headers.get('Location'); if (redirectUrl) { // 手动发起重定向请求,携带自定义头 this.httpClient.get(redirectUrl, options).subscribe( targetResponse => { // 处理目标URL的响应内容 }, error => console.error('Redirect request failed:', error) ); } } else { // 处理非重定向的正常响应 } }, error => console.error('Initial request failed:', error) );
2. 方案二:后端配合传递头信息(适合必须用重定向的场景)
如果业务逻辑必须依赖重定向,可以通过后端把自定义头的内容转成URL参数或者Cookie传递:
- Spring后端调整:
@CrossOrigin(allowedHeaders = {"Content-Type", "Accept"}, exposedHeaders = {"Location"}) @RequestMapping("/abc.htm") public String handleRequest(HttpServletRequest request) { // 获取前端发送的自定义头(如果需要) String customHeader = request.getHeader("your-custom-header"); // 将头信息作为URL参数拼接到重定向地址 return "redirect:/target-url.htm?customHeader=" + customHeader; } - Angular调整:在目标请求中从URL参数里提取原头信息,或者直接从Cookie中读取。
3. 关键注意事项
- CORS配置:如果是跨域请求,Spring后端必须配置
@CrossOrigin,指定allowedHeaders包含你需要的自定义头,同时exposedHeaders包含Location,这样Angular才能读取到重定向地址。 - 避免重复逻辑:确保
getHeadersForCDRedirection()方法已经封装了你需要的所有请求头,不要在代码中重复创建headers变量,避免逻辑不一致。
总结
浏览器的默认重定向机制会丢弃自定义请求头,这是安全限制导致的,无法通过前端代码单独绕过。你需要结合后端配置,要么手动处理重定向并携带头信息,要么通过参数/Cookie传递原头内容,才能实现类似的需求。
内容的提问来源于stack exchange,提问作者Chetan Gorkal
相关产品推荐
相关产品推荐

