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

Angular 5 HTTP Client处理JWT登录时响应头Authorization缺失

解决JWT登录响应中Authorization字段在代码中无法获取的问题

嘿,我之前碰到过完全一样的情况!Chrome网络面板明明能看到Authorization头,但前端代码就是拿不到,这其实是CORS(跨源资源共享)的限制在搞鬼。

问题原因

浏览器出于安全考虑,默认只会让前端JS代码访问一部分「安全的」响应头(比如Content-Type、Cache-Control这些),像Authorization这类自定义或非标准头,必须由服务器明确声明允许暴露给前端,否则即使Network面板能看到,代码里也获取不到。

解决方案:服务器端配置Access-Control-Expose-Headers

你需要在服务器的登录接口响应头中添加Access-Control-Expose-Headers字段,把Authorization列进去。下面是几种常见后端框架的配置示例:

1. Node.js + Express

const express = require('express');
const app = express();

// 在CORS中间件里配置
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*'); // 根据实际需求调整跨源规则
  res.header('Access-Control-Expose-Headers', 'Authorization'); // 关键配置
  next();
});

// 登录接口
app.post('/login', (req, res) => {
  // 验证用户名密码,生成JWT
  const token = '你的JWT Token';
  res.header('Authorization', `Bearer ${token}`);
  res.header('Pragma', 'no-cache');
  res.json({ success: true });
});

2. Python + Django

在视图函数中添加响应头配置:

from django.http import JsonResponse

def login(request):
    # 用户名密码验证、生成JWT逻辑...
    token = '你的JWT Token'
    response = JsonResponse({'success': True})
    response['Authorization'] = f'Bearer {token}'
    response['Pragma'] = 'no-cache'
    # 声明允许暴露的头
    response['Access-Control-Expose-Headers'] = 'Authorization'
    return response

3. Java + Spring Boot

通过@CrossOrigin注解指定暴露的头:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;

@RestController
public class LoginController {

    @PostMapping("/login")
    @CrossOrigin(exposedHeaders = "Authorization") // 关键配置
    public String login(HttpServletResponse response) {
        String token = "你的JWT Token";
        response.setHeader("Authorization", "Bearer " + token);
        response.setHeader("Pragma", "no-cache");
        return "{\"success\": true}";
    }
}

前端验证

配置完服务器后,前端就可以正常获取Authorization头了。比如用fetch的例子:

fetch('/login', {
  method: 'POST',
  body: JSON.stringify({ username: 'xxx', password: 'xxx' }),
  headers: { 'Content-Type': 'application/json' }
})
.then(response => {
  const token = response.headers.get('Authorization'); // 现在能正常拿到了!
  console.log(token);
  return response.json();
});

或者用axios:

axios.post('/login', { username: 'xxx', password: 'xxx' })
.then(response => {
  const token = response.headers.authorization; // axios中响应头key为小写
  console.log(token);
});

简单来说,就是服务器得明确告诉浏览器:「这个Authorization头可以让前端JS访问」,不然浏览器会出于安全考虑把它藏起来哦~

内容的提问来源于stack exchange,提问作者Casey Harrils

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:02:53