shiro框架学习-9-shiroSession
1.什么是会话session :
用户和程序直接的链接,程序可以根据session识别到哪个用户,和javaweb中的session类似
2. 什么是会话管理器SessionManager :
会话管理器管理所有subject的所有操作,是shiro的核心组件,它是一个接口,定义如下:
public interface SessionManager {
// 开启一个session
Session start(SessionContext var1);
// 根据指定的key获取session
Session getSession(SessionKey var1) throws SessionException;
}
shiro中的会话管理器有多个实现:
3. shiroSession 会话存储/持久化:
shiro的SessionDao接口,提供了session的创建,获取,更新,删除,获取所有session的方法
public interface SessionDAO {
Serializable create(Session var1); Session readSession(Serializable var1) throws UnknownSessionException; void update(Session var1) throws UnknownSessionException; void delete(Session var1); Collection<Session> getActiveSessions();
}
它的实现类如下,自定义缓存管理器,可以继承 AbstractSessionDAO
AbstractSessionDAO 源码如下:
package org.apache.shiro.session.mgt.eis; import java.io.Serializable;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.SimpleSession; public abstract class AbstractSessionDAO implements SessionDAO {
private SessionIdGenerator sessionIdGenerator = new JavaUuidSessionIdGenerator(); public AbstractSessionDAO() {
} public SessionIdGenerator getSessionIdGenerator() {
return this.sessionIdGenerator;
} public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) {
this.sessionIdGenerator = sessionIdGenerator;
}
// shiro默认使用了uuid来产生sessionId,如果需要自定义sessionId,可以实现SessionIdGenerator接口,实现其中的方法
protected Serializable generateSessionId(Session session) {
if (this.sessionIdGenerator == null) {
String msg = "sessionIdGenerator attribute has not been configured.";
throw new IllegalStateException(msg);
} else {
return this.sessionIdGenerator.generateId(session);
}
} public Serializable create(Session session) {
Serializable sessionId = this.doCreate(session);
this.verifySessionId(sessionId);
return sessionId;
} private void verifySessionId(Serializable sessionId) {
if (sessionId == null) {
String msg = "sessionId returned from doCreate implementation is null. Please verify the implementation.";
throw new IllegalStateException(msg);
}
} protected void assignSessionId(Session session, Serializable sessionId) {
((SimpleSession)session).setId(sessionId);
} protected abstract Serializable doCreate(Session var1); public Session readSession(Serializable sessionId) throws UnknownSessionException {
Session s = this.doReadSession(sessionId);
if (s == null) {
throw new UnknownSessionException("There is no session with id [" + sessionId + "]");
} else {
return s;
}
} protected abstract Session doReadSession(Serializable var1);
}
4. RememberMe功能
1、 Cookie 写到客户端并 保存
2、 通过调用subject.login()前,设置 token.setRememberMe(true);
3、 关闭浏览器再重新打开;会发现浏览器还是记住你的
4、 注意点:
- subject.isAuthenticated() 表示用户进行了身份验证登录的,即Subject.login 进行了登录
- subject.isRemembered() 表示用户是通过RememberMe登录的
- subject.isAuthenticated()==true,则 subject.isRemembered()==false, 两个互斥
- 特殊页面或者API调用才需要authc进行验证拦截,该拦截器会判断用户是否是通过 subject.login()登录,安全性更高
shiro框架学习-9-shiroSession的更多相关文章
- shiro框架学习-5-自定义Realm
1. 自定义Realm基础 步骤: 创建一个类 ,继承AuthorizingRealm->AuthenticatingRealm->CachingRealm->Realm 重写授权方 ...
- shiro框架学习-1-shiro基本概念
1. 什么是权限控制 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源, ...
- shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密
1. shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .c ...
- shiro框架学习-8-shiro缓存
1. shiro进行认证授权时会查询数据库获取用户角色权限信息,每次登录都会去查询,这样对性能会又影响.可以设置缓存,查询时先去缓存中查找,缓存中没有再去数据库查询. 从shiro的架构图中可以看到有 ...
- shiro框架学习-4- Shiro内置JdbcRealm
1. JdbcRealm 数据库准备 JdbcRealm就是用户的角色,权限都从数据库中读取,也就是用来进行用户认证授权的安全数据源更换为从数据库中读取,其他没有差别,首先在数据库创建三张表: CR ...
- shiro框架学习-3- Shiro内置realm
1. shiro默认自带的realm和常见使用方法 realm作用:Shiro 从 Realm 获取安全数据 默认自带的realm:idae查看realm继承关系,有默认实现和自定义继承的realm ...
- shiro框架学习-2-springboot整合shiro及Shiro认证授权流程
1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- shiro框架学习-7- Shiro权限控制注解和编程方式
讲解权限角色控制 @RequiresRoles, @RequiresPermissions等注解的使用和编程式控制 配置文件的方式 使用ShiroConfig 注解方式 @RequiresRoles( ...
- Shiro安全框架学习笔记
一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和JavaEE项目中都可以使用.它主要用来处理身份认证,授权,企业会话管理 ...
随机推荐
- Centos7的引导顺序
1.UEFI或BIOS初始化,运行POST开机自检(Power On Self Test) 2.选择启动设备 3.引导装载程序grub2 4.加载装载程序的配置文件:/etc/grub.d/ ...
- excel常用公式--关联匹配类
index: 根据位置返回单元格的值. match: 根据单元格的值返回位置. index+match替代vlookup rank:返回一列数字的数字排位.数字的排位是其相对于列表中其他值的大小.
- HTML简单介绍(个人角度)
之前对HTML的理解:HTML主要是标签组成,一对标签组成一个位置,在响应的位置内填写对应的内容. 1.编译工具 [ ] HTML需要编译工具?txt文档改后缀双击运行. [ ] 了解前端了一下前端, ...
- tableau单机版安装
参考: https://help.tableau.com/current/server-linux/zh-cn/requ.htm 先将服务器防火墙80级8850端口打开 临时关闭SELinux/防 ...
- Elasticsearch-安装、日志解读
ES-安装.日志解读 1. 准备tar包 https://www.elastic.co/cn/products/elasticsearch2. 解压 tar -zxvf elasticsearch-. ...
- java集合之 ConcurrentHashMap的产生
ConcurrentHashMap: 在java集合中 最常用的是ArrayList 效率最高的还是HashMap 但是线程不安全 HashTable是线程安全的(里面的方法是同步方法) 但相比 ...
- Spring+Spring MVC+Hibernate框架搭建实例
前言:这里只是说明整个搭建流程,并不进行原理性的讲解 一 下面所需要用到的数据库配置: 数据库方面,使用mysql创建一个users表,具体代码如下: 1 2 3 4 5 6 7 8 9 10 11 ...
- gulp.js实现less批量实时编译
问题描述: 在之前一直用Koala编译less文件,但本人感觉Koala用起来非常麻烦,好像不能做多个less文件的批量的编译:因为目前项目也没有用到webpack,我的less是通过vs code ...
- ansible获取远程机器上的ip地址
问题: 想要使用ansible-playbook脚本创建一个以远程机器的IP命名的目录 错误的代码:# vim test.yml --- - hosts: all remote_user: root ...
- bat 感想
用bat做了个跨版本更新包的生成脚本,由于之前都是写一些很简单bat,或者python里使用windows命令,所以纯用bat做这个东西,还是有点复杂的. 过程中遇到很多问题,主要是参数太多,变量的使 ...