如何从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
相关产品推荐
相关产品推荐

