Shiro——RememberMe

Shiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下:

1、首先在登录页面选中RememberMe然后登录成功;如果是浏览器登录,一般会把RememberMe的Cookie写到客户端并保存下来;

2、关闭浏览器再重新打开;会发现浏览器还是记住你的;

3、访问一般的网页服务器端还是知道你是谁,且能正常访问;

4、但是比如我们访问淘宝时,如果要查看我的订单或进行支付时,此时还是需要再进行身份认证的,以确保当前用户还是你。

RememberMe配置

spring-shiro-web.xml配置:

Java代码

<!-- 会话Cookie模板 -->  
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  <constructor-arg value="sid"/>  <property name="httpOnly" value="true"/>  <property name="maxAge" value="-1"/>  
</bean>  
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  <constructor-arg value="rememberMe"/>  <property name="httpOnly" value="true"/>  <property name="maxAge" value="2592000"/><!-- 30天 -->  
</bean>   

sessionIdCookie:maxAge=-1表示浏览器关闭时失效此Cookie;

rememberMeCookie:即记住我的Cookie,保存时长30天;

Java代码

<!-- rememberMe管理器 -->  
<bean id="rememberMeManager"   
class="org.apache.shiro.web.mgt.CookieRememberMeManager">  <property name="cipherKey" value="  
#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>  <property name="cookie" ref="rememberMeCookie"/>  
</bean>   

rememberMe管理器,cipherKey是加密rememberMe Cookie的密钥;默认AES算法;

Java代码

<!-- 安全管理器 -->  
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
……  <property name="rememberMeManager" ref="rememberMeManager"/>  
</bean>   

设置securityManager安全管理器的rememberMeManager;

Java代码

<bean id="formAuthenticationFilter"   
class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">  ……  <property name="rememberMeParam" value="rememberMe"/>  
</bean>   

rememberMeParam,即rememberMe请求参数名,请求参数是boolean类型,true表示rememberMe。

Java代码

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  ……  <property name="filterChainDefinitions">  <value>  /login.jsp = authc  /logout = logout  /authenticated.jsp = authc  /** = user  </value>  </property>  
</bean>   

“/authenticated.jsp = authc”表示访问该地址用户必须身份验证通过(Subject. isAuthenticated()==true);而“/** = user”表示访问该地址的用户是身份验证通过或RememberMe登录的都可以。

测试:

1、访问http://localhost:8080/chapter13/,会跳转到登录页面,登录成功后会设置会话及rememberMe Cookie;

2、关闭浏览器,此时会话cookie将失效;

3、然后重新打开浏览器访问http://localhost:8080/chapter13/,还是可以访问的;

4、如果此时访问http://localhost:8080/chapter13/authenticated.jsp,会跳转到登录页面重新进行身份验证。

如果要自己做RememeberMe,需要在登录之前这样创建Token:UsernamePasswordToken(用户名,密码,是否记住我),如:

Java代码

Subject subject = SecurityUtils.getSubject();  
UsernamePasswordToken token = new UsernamePasswordToken(username, password);  
token.setRememberMe(true);  
subject.login(token);   

subject.isAuthenticated():表示用户进行了身份验证登录的,即使有Subject.login进行了登录;subject.isRemembered():表示用户是通过记住我登录的,此时可能并不是真正的你(如你的朋友使用你的电脑,或者你的cookie被窃取)在访问的;且两者二选一,即subject.isAuthenticated()==true,则subject.isRemembered()==false;反之一样。

另外对于过滤器,一般这样使用:

访问一般网页,如个人在主页之类的,我们使用user拦截器即可,user拦截器只要用户登录(isRemembered()==true or isAuthenticated()==true)过即可访问成功;

访问特殊网页,如我的订单,提交订单页面,我们使用authc拦截器即可,authc拦截器会判断用户是否是通过Subject.login(isAuthenticated()==true)登录的,如果是才放行,否则会跳转到登录页面叫你重新登录。

因此RememberMe使用过程中,需要配合相应的拦截器来实现相应的功能,用错了拦截器可能就不能满足你的需求了。

参考文章:https://www.iteye.com/blog/jinnianshilongnian-2031823

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python报表_Python生成报表

excel def export_teachers_excel(request): # 创建工作簿 wb xlwt.Workbook() # 添加工作表 sheet wb.add_sheet(老师信息表) # 查询所有老师的信息(注意&#xff1a;这个地方稍后需要优化) queryset Teacher.objects.all() # 向Excel表单中写入表头 colnames (姓名, 介绍…

Spring中ioc的实现原理

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念&#xff0c;对于初学Spring的人来说&#xff0c;总觉得IoC 、DI这两个概念是模糊不清的&#xff0c;是很难理解的&#xff0c;今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…

如何将一个向量投影到一个平面上_CameraLidar投影:2D3D导航

点击上方“AI小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达图1.图像上的激光雷达点激光雷达和照相机是用于感知和理解场景的两个基本传感器。他们建立周边环境模型、提供检测和确定其他对象位置的方法&#xff0c;从而为机器人提…

java类加载机制面试题_通过面试题解析 Java 类加载机制

在许多Java面试中&#xff0c;我们经常会看到关于Java类加载机制的考察&#xff0c;例如下面这道题&#xff1a;class Grandpa{static{System.out.println("爷爷在静态代码块");}}class Father extends Grandpa{static{System.out.println("爸爸在静态代码块&qu…

JAVA中和、||和|的区别?

问题一&#xff1a;JAVA中&&和&、||和|&#xff08;短路与和逻辑与、短路或和逻辑或&#xff09;的区别&#xff1f; 首先名称是不同的 逻辑运算符&#xff1a;&#xff06;&#xff06;逻辑与  &#xff5c;&#xff5c;逻辑或  它们都是逻辑运算符 位运算…

pppoe拨号的外网ip无法ping通_【思唯网络学院】 五大网络概念:IP地址、子网掩码、网关、DHCP服务和PPPoE拨号...

5G技术的更新&#xff0c;推动了新一代的网络通信发展&#xff0c;家庭宽带上网也从最初的十几K的速度&#xff0c;提升到了现在动则上百上千兆的速度&#xff0c;很多有部署了家庭NAS的用户&#xff0c;甚至都已经更新到了10G级别的内部局域网了。在这个信息互联的时代&#x…

jsp import mysql con_jsp的分页查询的代码(mysql数据库)

[原来没有写过&#xff0c;听朋友说&#xff0c;比较难&#xff0c;就试一下&#xff0c;还是挺简单的&#xff0c;只不过&#xff0c;具体实用方面还得自己写&#xff0c;没有什么难的&#xff0c;自己看看就懂了。bean文件&#xff1a;package bean;/** * jspjava bea这个功能…

MySQL数据库的数据类型以及取值范围详解

主要包括以下五大类&#xff1a; 整数类型&#xff1a;BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型&#xff1a;FLOAT、DOUBLE、DECIMAL 字符串类型&#xff1a;CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDI…

flex布局_flex布局的 flex(felx-grow、flex-shrink、flex-basis)详解

flex布局中的flex-grow,flex-shrink,flex-basis接上篇文章&#xff0c;1. flex-grow属性flex-grow定义剩余空间的分成。默认为0&#xff0c;即如果存在剩余空间&#xff0c;也不放大。如何理解这里的剩余空间呢&#xff0c;用例子来说明吧。默认的情况(flex-grow:0)在浏览器下是…

python教学视频r_R Tutorial

教程列表&#xff1a;Customizing The Look of R Studio (R Tutorial 1.11)Correlation and Covariance in R (R Tutorial 4.9)Checking Linear Regression Assumptions in R (R Tutorial 5.2)Changing a Numeric Variable to Categorical Variable in R (R Tutorial 5.4)Chang…

Mina网络通信框架

认识 Mina Apache Mina Server 是一个网络通信应用框架&#xff0c;与 Netty 出自同一作者&#xff0c;Netty 借鉴了部分 Mina 的设计思路。 Mina 主要是对基于 TCP/IP、UDP/IP 协议栈的通信框架&#xff0c;Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用&#x…

每个tabpage中都有一个dategridview_每个女人,都有一个礼服梦

●今天&#xff0c;我要带着大家跟随几部经典电影&#xff0c;来开启一场关于礼服的时空穿越。01. 《爱玛》//关键词&#xff1a;19世纪初英国乡村经历了巴洛克风格的洗礼&#xff0c;服饰的整体风格变得柔和了不少&#xff0c;蕾丝、细纱、蝴蝶结这些浪漫元素&#xff0c;是这…

ssm框架sql换成MySQL_搭建ssm框架,可实现登录和数据展示以及增删改查

需求&#xff1a;后台使用ssm(spring-springMVC-mybatis)进行整合前台使用bootstrap框架前后台交互使用Ajax进行发送表结构&#xff1a;登录页面后显示所有用户信息&#xff0c;可对每条进行增删改查登录时也使用本表的user_name和user_pwd进行校验项目目录结构步骤一&#xff…

巧妙mybatis避免Where 空条件的尴尬

我就废话不多说了&#xff0c;大家还是直接看代码吧~ <select id"findActiveBlogLike" resultType"Blog">SELECT * FROM BLOGWHERE<if test"state ! null">state #{state}</if> </select>如果state参数为空时&#x…

numpy 矩阵与向量相乘_高能!8段代码演示Numpy数据运算的神操作

作者&#xff5c;王天庆来源&#xff5c;大数据(ID&#xff1a;hzdashuju)导读&#xff1a;本文介绍一下在Python科学计算中非常重要的一个库——Numpy。Numpy是Numerical Python extensions 的缩写&#xff0c;字面意思是Python数值计算扩展。Numpy是Python中众多机器学习库的…

Spring Boot——日志配置

日志&#xff0c;通常不会在需求阶段作为一个功能单独提出来&#xff0c;也不会在产品方案中看到它的细节。但是&#xff0c;这丝毫不影响它在任何一个系统中的重要的地位。 为了保证服务的高可用&#xff0c;发现问题一定要即使&#xff0c;解决问题一定要迅速&#xff0c;所…

python2转python3代码_Python2代码转成Python3代码

1.利用anaconda软件自带的功能: 1.找2to3.py文件 我的anaconda装在了D盘下的Anaconda文件夹下 你需要找到anaconda下的script文件夹里面的2to3-script.py文件(由于版本不同,可能名字不太一样,但是一定是2to3开头,而且是py文件)打开2to3-script.py文件后(内容肯定都是一样的):2.…

hbase java api count_HBase内置过滤器java api的总结

1、RowFilter:筛选出匹配的所有的行(使用过)//rowkey 等于 test|id9Filter filternew RowFilter(CompareOperator.EQUAL,new BinaryComparator(Bytes.toBytes("test|id9")));2、PrefixFilter:筛选出具有特定前缀的行健的数据//rowkey 以test开头Filter filternew Pre…

是否有必要使用外键?为什么不用外键?

什么是外键&#xff1a; 如果一个实体的某个字段指向另一个实体的主键&#xff0c;就称为外键。被指向的实体&#xff0c;称之为主实体&#xff08;主表&#xff09;&#xff0c;也叫父实体&#xff08;父表&#xff09;。负责指向的实体&#xff0c;称之为从实体&#xff08;…

haproxy keepalived_Haproxy+KeepAlived+Mycat实现高可用集群

1.什么是HaproxyHAProxy是一个使用C语言编写的自由及开放源代码软件[1]&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬…