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

Spring+Thymeleaf页面无法显示登录用户名问题求助

问题分析与解决方案

核心问题原因

  1. Controller参数注入错误:直接将UserModel作为方法参数时,Spring会创建一个全新的空实例,而非当前登录用户的对象,调用userModel.getUsername()时触发空指针相关异常(对应调试提示翻译:在执行model.addAttribute("person", userModel.getUsername());时出现0x000000080036c000.invokeVirtual(Object, Object, Object, Object) 行:不可用)。
  2. 前后端变量不匹配:Controller中添加到Model的属性名为person,但Thymeleaf页面中却引用${userModel.Username},既没有对应属性,还违反JavaBean规范(getUsername()对应属性名应为username,首字母小写)。

是否需要改用Principal类?

是的,Principal(或Authentication、@AuthenticationPrincipal)是Spring获取当前登录用户的标准方式,直接注入UserModel无法获取已登录用户实例。

修正步骤

1. 修改Controller获取用户名

推荐以下三种标准实现方式:

方式一:使用Principal参数

@GetMapping("/products")
public String getProducts(Model model, Principal principal) {
    List<ProductModel> products = productService.getAllProducts();
    model.addAttribute("products", products);
    // 直接通过Principal获取登录用户名
    model.addAttribute("username", principal.getName());
    return "products";
}

方式二:使用Authentication参数

@GetMapping("/products")
public String getProducts(Model model, Authentication authentication) {
    List<ProductModel> products = productService.getAllProducts();
    model.addAttribute("products", products);
    // 获取登录用户的用户名
    model.addAttribute("username", authentication.getName());
    return "products";
}

方式三:使用@AuthenticationPrincipal(自定义UserDetails场景)

如果你的UserModel实现了UserDetails接口,可以直接注入当前用户:

@GetMapping("/products")
public String getProducts(Model model, @AuthenticationPrincipal UserModel userModel) {
    List<ProductModel> products = productService.getAllProducts();
    model.addAttribute("products", products);
    model.addAttribute("username", userModel.getUsername());
    return "products";
}

2. 修正Thymeleaf页面变量引用

将页面中的欢迎语部分修改为与Controller中一致的属性名:

<h2>Welcome, <span th:text="${username}"></span></h2>

其他可能遗漏的配置

  • Spring Security配置检查:确保已开启HTTP Basic或表单登录认证,且/products接口被配置为需要登录访问(否则Principal/Authentication会为null)。示例配置片段:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/products").authenticated()
                .anyRequest().permitAll()
            )
            .formLogin(form -> form.permitAll());
        return http.build();
    }
}
  • UserModel规范检查:确保UserModel的getUsername()方法符合JavaBean规范(方法名正确,返回值非null),如果是自定义UserDetails,需确保重写getUsername()方法返回正确的用户名。
  • 认证流程验证:确认用户确实已通过登录流程完成认证,可在Controller中打印principal或authentication对象,验证是否为非null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:13