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

调用REST API时无法获取登录用户名,附前后端代码求助

解决后端无法获取登录用户名的问题

看起来你遇到的核心问题是前端发起POST请求时,后端没法拿到当前登录用户的信息。这通常是因为请求没有携带用户身份认证的凭证,或者后端的身份信息获取方式有问题。下面分两种最常见的认证场景来给你解决方案:

场景1:基于Session的认证(比如Spring Security默认会话机制)

如果你的系统是用Session来维护登录状态的,那问题大概率出在前端fetch请求没有携带Cookie(Session ID存在Cookie里)。Fetch API默认不会自动发送Cookie到服务器,需要手动配置:

修改前端Fetch代码

在fetch的配置对象里加上credentials: 'include'(跨域场景)或者credentials: 'same-origin'(同域场景):

fetch(url, {
  method: 'POST',
  headers: {
    'Accept': 'application/json, text/plain, */*',
    'Content-type': 'application/json'
  },
  credentials: 'include', // 关键:携带Cookie
  body: JSON.stringify(transactionArr)
}).then(function (response) {
  if(response.status === 200){
    alert("service sales successfully completed");
    window.location.reload();
  }
})

后端配置注意事项(如果是跨域请求)

如果前端和后端是跨域的,你需要在后端CORS配置里允许携带凭证:
比如Spring Boot里的CORS配置:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://your-frontend-domain.com") // 不能用*,必须指定具体域名
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowCredentials(true); // 允许携带凭证
    }
}

后端获取用户名的正确方式(Spring为例)

确保你是从SecurityContext里获取登录用户:

@RequestMapping(value = "/createServiceBill", method = RequestMethod.POST)
public ResponseEntity<?> createServiceBill(@RequestBody List<Transaction> transactionArr) {
    // 获取登录用户名
    String username = SecurityContextHolder.getContext().getAuthentication().getName();
    // 后续业务逻辑
    return ResponseEntity.ok("Success");
}

场景2:基于JWT Token的认证

如果你的系统用JWT作为认证方式,那需要在请求头里携带Token,后端解析Token获取用户名:

修改前端Fetch代码

在请求头里添加Authorization字段,值为Bearer 你的JWT Token:

// 假设你从本地存储里拿到了登录后的token
const token = localStorage.getItem('authToken');

fetch(url, {
  method: 'POST',
  headers: {
    'Accept': 'application/json, text/plain, */*',
    'Content-type': 'application/json',
    'Authorization': `Bearer ${token}` // 携带JWT Token
  },
  body: JSON.stringify(transactionArr)
}).then(function (response) {
  if(response.status === 200){
    alert("service sales successfully completed");
    window.location.reload();
  }
})

后端解析Token获取用户名(Spring为例)

可以用@RequestHeader获取Token,然后解析:

@RequestMapping(value = "/createServiceBill", method = RequestMethod.POST)
public ResponseEntity<?> createServiceBill(
        @RequestBody List<Transaction> transactionArr,
        @RequestHeader("Authorization") String authHeader) {
    // 提取Token(去掉Bearer前缀)
    String token = authHeader.substring(7);
    // 解析Token获取用户名,这里假设你有JWT解析工具类
    String username = JwtUtil.extractUsername(token);
    // 后续业务逻辑
    return ResponseEntity.ok("Success");
}

或者用Spring Security的JWT过滤器自动解析,直接通过SecurityContext获取:

String username = SecurityContextHolder.getContext().getAuthentication().getName();

额外排查点

  1. 确认用户确实已经登录:可以在前端打印一下当前的登录状态,或者在浏览器开发者工具里看Cookie/Token是否存在。
  2. 后端检查认证机制是否正确:比如Spring Security的配置是否生效,是否正确拦截了请求并进行身份认证。

内容的提问来源于stack exchange,提问作者sagar limbu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:33:54