Shiro会话管理

小灰灰 2024-04-18 11:53 218阅读 0赞

注:该系列所有测试均在之前创建的Shiro3的Web工程的基础上。
下面我们来说一下Shiro里面的会话管理,这个“会话”与JavaWeb里面的HttpSession
是一致的,都是表示客户端与服务器的一次会话。

Shiro会话概述

Shiro 提供了完整的企业级会话管理功能,不依赖于底层容 器(如web容器tomcat),不管 JavaSE 还是 JavaEE 环境 都可以使用,提供了会话管理、会话事件监听、会话存储/ 持久化、容器无关的集群、失效/过期支持、对Web 的透明 支持、SSO 单点登录的支持等特性。

会话相关的API

  1. Subject.getSession():即可获取会话;其等价于 Subject.getSession(true),即如果当前没有创建 Session 对象会创建 一个;Subject.getSession(false),如果当前没有创建 Session 则返回 null 。
  2. session.getId():获取当前会话的唯一标识 • session.getHost():获取当前Subject的主机地址。
  3. session.getTimeout() & session.setTimeout(毫秒):获取/设置当 前Session的过期时间 。
  4. session.getStartTimestamp() & session.getLastAccessTime(): 获取会话的启动时间及最后访问时间;如果是 JavaSE 应用需要自己定 期调用 session.touch() 去更新最后访问时间;如果是 Web 应用,每次进入 ShiroFilter 都会自动调用 session.touch() 来更新最后访问时间。
  5. session.touch() & session.stop():更新会话最后访问时 间及销毁会话;当Subject.logout()时会自动调用 stop 方法 来销毁会话。如果在web中,调用 HttpSession. invalidate() 也会自动调用Shiro Session.stop 方法进行销毁Shiro 的会话 。
  6. session.setAttribute(key, val) & session.getAttribute(key) & session.removeAttribute(key):设置/获取/删除会话属 性;在整个会话范围内都可以对这些属性进行操作。
  7. session.getHost():获取当前Subject的主机地址。
  8. SessionListener会话监听器用于监听会话创建、过期以及停止事件:onStart(Session)、onStop(Session)、onExpiration(Session)分别监听了Session启动、销毁以及Session过期的时候。与HttpSessionListener很相似。

在Controller层,我们建议大家使用原生的HttpSession。那么Shiro的Session有什么意义呢?要知道,我们在传统的Web应用中,是无法在Service层获取Session会话的,也不建议这么做(应用会变成侵入式的)。但是现在有了Shrio的Session后,我们就可以在Service中使用会话。

下面我们测试一下,在之前的测试工程的ShiroLoginController中的为了测试权限注解的testShiroAnnocation方法参数中,添加传统会话HttpSession,并在Session中放置一个参数:

  1. package com.test.shiro.controller;
  2. import javax.servlet.http.HttpSession;
  3. import org.apache.shiro.SecurityUtils;
  4. import org.apache.shiro.authc.AuthenticationException;
  5. import org.apache.shiro.authc.UsernamePasswordToken;
  6. import org.apache.shiro.subject.Subject;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import com.test.shiro.services.ShiroService;
  11. @Controller
  12. @RequestMapping("userAuth")
  13. public class ShiroLoginController {
  14. @Autowired
  15. private ShiroService shiroService;
  16. @RequestMapping("/testShiroAnnocation")
  17. private String testShiroAnnocation(HttpSession session){
  18. session.setAttribute("test", "Hello1234");
  19. shiroService.testMethod();
  20. return "redirect:/list.jsp";
  21. }
  22. //下面的其它代码省略
  23. }

然后在shiroService的testMethod方法中通过Shiro的Session获取我们在Controller中设置的参数:

20171217142649471

然后我们重启Web测试项目,使用admin登录后,在主页访问“/testShiroAnnocation”服务:

20171217142657896

总结:
在Controller层我们使用的是HttpSession,而在Service层我们使用的是Shiro的Session,这样的话提供了一个好处,就是即便是在Service层,我们也可以访问到Session的数据。在开发中这个特性是很方便的,这也是Shiro的Session会话在开发中的一个重要作用。

发表评论

表情:
评论列表 (有 0 条评论,218人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Shiro会话管理

    :该系列所有测试均在之前创建的Shiro3的Web工程的基础上。 下面我们来说一下Shiro里面的会话管理,这个“会话”与JavaWeb里面的HttpSession ...

    相关 Shiro学习(24)在线会话管理

    有时候需要显示当前在线人数、当前在线用户,有时候可能需要强制某个用户下线等;此时就需要获取相应的在线用户并进行一些操作。 本章基于《第十六章 综合实例》代码构建。 会话控制

    相关 Apache Shiro 会话管理

    在安全框领域,Apache Shiro 提供了一个独一无二的东西:一个完整的企业级Session 解决方案,从最简单的命令行及智能手机应用到最大的集群企业Web 应用程序。如果

    相关 Apache Shiro 会话管理

    在安全框领域,ApacheShiro提供了一个独一无二的东西:一个完整的企业级Session解决方案,从最简单的命令行及智能手机应用到最大的集群企业Web应用程序。如果你需要s

    相关 Shiro 会话管理了解

    Shiro 提供了一个完整的企业级会话管理解决方案,不再依赖web容器。可以在web和非web环境下使用。   1、Shiro的session特性         1