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

如何从Apache Shiro登录表单中提取会话中的用户名?

在Shiro认证后从Servlet获取用户名的正确方式

嘿,我来帮你解决这个问题!首先明确说:Shiro确实会帮你管理认证后的用户信息,不需要手动在会话里存,直接通过Shiro的Subject API就能拿到用户名。

为啥request.getParameter("username")没用?

你配置的authc.successUrl = /secret/SecretStockServlet是重定向操作:登录表单提交是第一个POST请求,认证成功后Shiro会发一个重定向响应给浏览器,浏览器再发起一个新的GET请求到SecretStockServlet——这时候原来表单里的username参数早就没了,所以用request.getParameter肯定拿不到。

正确操作:从Shiro Subject取用户名

你已经在Servlet里获取了Subject currentUser = SecurityUtils.getSubject();,这就好办了!认证成功后,Shiro会把用户的"身份标识"(也就是你输入的用户名)存在Subject的Principal里,直接调用currentUser.getPrincipal()就能拿到。

修改后的Servlet代码示例:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    String address;
    try {
        List<SalesStock> list = stockRepository.getAllSalesStock();
        address = "/secret/stock.jsp";
        
        // 获取当前登录的用户Subject
        Subject currentUser = SecurityUtils.getSubject();
        // 取出用户名(这里Principal就是你登录时的username)
        String username = (String) currentUser.getPrincipal();
        
        // 把用户名放到request里,方便后续页面使用,或者直接在Servlet里用
        request.setAttribute("username", username);
        request.setAttribute("list", list);
    } catch (Exception ex) {
        address = "/error.jsp";
    }
    RequestDispatcher dispatcher = request.getRequestDispatcher(address);
    dispatcher.forward(request, response);
}

额外说明:关于Shiro的配置和会话

  • 你不用在shiro.ini里额外配置会话变量,Shiro自动处理认证后的用户信息存储。
  • 如果以后要存自定义的会话数据,比如用户的昵称、权限信息,可以用currentUser.getSession().setAttribute("nickname", "张三"),然后用getAttribute取出,但用户名这种核心身份信息,用getPrincipal()是最规范的做法。
  • 你的shiro.ini里authc.usernameParam = username配置是对的,这是告诉Shiro从请求参数里的username字段取用户名,和你的表单name对应,保证了认证时能正确拿到用户名。

测试一下

登录成功后,在Servlet里拿到的username就是你输入的账号,你可以把它传到JSP里用${username}显示,或者在Servlet里直接用来做业务逻辑,比如根据用户名查用户的其他信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:42:44