Shiro - Spring + Jedis(会话、缓存、自动登录)整合篇
发布日期:2021-06-30 23:50:39
浏览次数:2
分类:技术文章
本文共 3435 字,大约阅读时间需要 11 分钟。
零、前言
一、Shiro 集成 Spring
- Shiro集成Spring
- Shiro集成Spring-从数据库获取数据
- 通过注解配置授权
- Shiro过滤器
Shiro过滤器
- 内建过滤器:roles[a,b,c] 必须权限都符合才可以、perms[a,b,c]必须权限同时具备才可以。
- anon 代表无需权限authBasic:httpBasicauthc 代表需要认证才能访问user 代表需要存在用户对象才能被访问logout 登录退出才能被访问perms 拥有权限才能被访问roles 拥有角色才能被访问ssl : 要求是安全的协议(不常用)port 相应端口号才能访问(不常用)
- 自定义,分认证与授权,如果是认证则继承认证的类,如果是授权则继承授权的类。然后重写方法,其中参数Object o 即代表存在哪些参数,即perms[a,b,c]中的abc然后判断返回结果true 或者false即可。
- 在后台xml文件中引入该filter的bean,然后在主过滤器中引入filter的标签,写入entry key 与 value-ref,然后在filter过滤中
- filterChainDefinitions地方按照之前的规则使用该自定义过滤,写入key值即可。
二、Shiro 会话管理
Shiro 会话管理
其会话管理主要涉及到了Shiro整体框架的SessionManager与SessionDao模块。
视频中讲的是与Redis相结合,进行对Session的增删改查操作。
当然Shiro管理Session还可以通过别的介质进行管理。
步骤如下:
- 先加载Redis,在Maven 的pom.xml文件中配置Redis依赖包,坐标如下:
redis.clients jedis 2.7.3 - 配置Spring与Redis结合的配置文件。新建立Spring-redis.xml文件。由于之前也没接触过Redis,这里只能重复视频中的配置。配置JedisPool的bean,其中设置属性jedisPoolConfig、host、port信息,其中JedisPoolConfig则需要另外建立bean,然后将此Bean引入到JedisPool中,host则写本机地址,port一般为6379.当然以上的类都是Redis包下的,Redis是依靠Jedis来实现其功能。然后将此文件导入到Spring.xml主文件中,即采用import标签。注意:需要下载相应redis server,程序启动的时候,要先启动redis server,否则会报错。
- 新建util包,建立JedisUtil类,此类中主要是对Redis进行增删改查操作。因为Reids是存放键值对的形式。在JedisUtil中,将JedisPool注入到类中,写入单独方法获取Jedis,即通过JedisPool.getResource()来获取Jedis,此方法用于获取Jedis对象,通过Jedis进行直接对Redis存放值进行增删改查操作。
- 创建Shiro中SessionDao类,实现AbstractSessionDao,实现其中的增删改查、获取当前活跃的Session等方法。由于redis中存放的是key与value都是二进制的数组形式,所以在修改Redis值的时候需要注意将其转成二进制的数据,并且判断是否存在相应id、session等。其中: generateSessionId(session) 生成Serializable序列化的sessionId assignSessionId(session,sessionId) 绑定session与相应的Id值session.getId 返回的是SessionId值,同理也是Serializable的类型SerializationUtils.serialize (session) 通过序列化将session转成相应的byte[]数组SerializationUtils.deserialize(byte[]) 通过反序列化将字节转成Object类型,可通过强转获取Session对象PS:注意session 与 sessionId是否为空的情况判断。另外如果加入前缀,可以在搜索的时候加入前缀+“*”代表搜索前缀是aa的所有匹配的key值。
- 同样JedisUtils中也需要通过Jedis 的get put expire del keys方法进行获取 存储 设置等待时间 删除操作、查询匹配key的值集合。
- 新建类SessionManager 继承 DefaultWebSessionManager类,里面可以什么都不做。
- 在spring.xml文件中,写入SessionManager的Bean 并且写入Sessiondao的bean,将SessionDao的Bean 注入到Sessionmanager中。最后将SessionManager的Bean注入到SecurityManager中即可。
- 此处在测试过程中,发现系统会读取Session多次。【需要重构第6点的DefaultWebSessionManager】需要在SessionManager中重写,retrieveSession方法。a、先通过参数SessionKey获取sessionId,然后判断sessionkey是否为websessionkey,如果是则通过强转将其转为WebSessionKey并且获取ServletRequest。b、核心是将SessionId 与 Session 放到Reqeust中,如果Request有,则直接拿去,没有在去Redis中拿,如此一来则减少了访问Redis的次数,减轻了Reids 的压力。此时判断request是否为空以及sessionId是否为空,如果同时都不为,则通过sessionId 从request的属性中获取Session,在判断Session是否为空,如果不是空,则返回。c、当不符合以上条件时候,直接调用父类的方法获取Session,继续判断request是否为空,如果不是空,则将session和sessionId放入到request的属性中即可,方便下次再来寻找直接从request中拿出,不用再多次访问Redis了。
三、Shiro 缓存管理
Shiro缓存管理
其缓存管理仍旧是依赖于Redis进行实现。
意为将从数据库取出来的数据放置到Redis缓存中去,如果缓存中有直接取出,没有则去数据库中获取并且放置到Reids缓存中。
步骤:
- 与之前的Session管理一致。首先创建CacheManager并且实现CacheManager接口。
- 创建Cache类实现Cache接口,其中有增删改查等方法。同样通过序列化与反序列化、二进制数组键值对等实现其中方法。
- 在CacheManager类中注入Cache类,并且将其作为返回值写入到实现的唯一方法的返回处。
- 将CacheManager在Spring.xml中进行配置Bean,并且将次设置到SecurityManager中。
- 都是通过JedisUtil完成的操作,均是将数据保存到了Redis中,无论是Session还是缓存只是多了一个Redis进行管理。
四、自动登录
Shiro 自动登录,意为记住密码。将用户名与密码记录在Cookie中。
主要通过配置来实现自动登录。【即:可以不登录,访问其他路径,就相当于sessionid 没有过期一个效果,记住了只要cookie没过期,也可以访问其他页面。】
步骤:
- 前端编码复选框“记住我“。
- 在Spring.xml文件中进行配置,配置CookieRememberMeManager,并且利用属性cookie,将外边的bean的SimpleCookie注入进去。SimpleCookie用构造方法设置名称,之后通过属性用maxAge设置超时时间即可。
- 在登录的时候,传入UserNameAndPassowrdToken的时候,其对象可以设置setRememberMe的属性,为true即为记住登录。
下载地址:
转载地址:https://lux-sun.blog.csdn.net/article/details/85695148 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月20日 11时34分05秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
爱了,吹爆这个高颜值的流程图工具!
2019-04-30
基于JAVA_JSP电子书下载系统
2019-04-30
2021最新 上海互联网公司排名
2019-04-30
字节vs快手!取消大小周之战
2019-04-30
Oracle 行转列 pivot函数基本用法
2019-04-30
Oracle字符串分隔符替换(替换奇数个或偶数个)
2019-04-30
Oracle 利用 UTL_SMTP 包发送邮件
2019-04-30
Oracle 的循环中的异常捕捉和处理
2019-04-30
Oracle通过pivot和unpivot配合实现行列转换
2019-04-30
给Oracle数据库换一个1522端口的监听
2019-04-30
Oracle的pfile和spfile的一点理解和笔记
2019-04-30
WebService的简单案例记录(Java)
2019-04-30
Html利用PHP与MySQL交互
2019-04-30
mysql的安装与卸载与Navicat远程连接
2019-04-30
java实现稀疏数组及将稀疏数组存入硬盘中
2019-04-30
2021-05-18
2019-04-30
Flutter 使用插件打开相册、相机
2019-04-30
libuv实现ping包发送和接收
2019-04-30
基础架构系列篇-CENTOS7安装NGINX
2019-04-30
基础架构系列篇-系统centos7安装docker+COMPOSE
2019-04-30