java如何记住登录状态_Spring security实现记住我下次自动登录功能过程详解

一、原理分析

第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecurity就会放行这次访问。

二、实现方式

2.1 简单实现方式

(1) 在springsecurity的配置文件中,http节点下增加一个remember-me配置

username-parameter="username" password-parameter="password"

authentication-failure-forward-url="/failed.html"

default-target-url="/index.html"

/>

其中remember-me-parameter="remembermeParamater"指定前台传递的是否rememberme的参数名,前台要传递的参数值是true或false

(2)前台登录页面上增加一个checkbox

用户名:

密 码:

记住我:

checkbox的name属性要和上边配置文件中的remember-me-parameter="remembermeParamater"保持一致。

(3)测试

启动工程,进行登录,登录成功后观察cookie,会发现服务器端返回了一个名为remember-me的cookie

3fea82ff9857f3684841c89a5b1846c4.png

现在关闭浏览器,再次打开并访问,只要不清除cookie就可以直接访问资源,不需要重新登录。

这种方式有个弊端,浏览器端要携带的这个cookie值服务端是存放在内存中的,并没有进行持久化,所以如果服务重启后服务器端存储的这个值就会丢失,浏览器端的rememberme就会失效。为了解决这个问题就需要将服务器端生成的这个cookie值持久化到数据库中。

2.2 数据库实现方式

(1)创建一张表用来持久化rememberme的记录

-- 创建记录rememberme记录的表

CREATE TABLE persistent_logins

(

username VARCHAR(64),

series VARCHAR(64),

token VARCHAR(64),

last_used DATE

);

(2)将spring-security 配置文件中的rememberme标签的内容改为如下内容

token-validity-seconds="86400"/>

data-source-ref="dataSource"用来指定数据源,spring-security通过数据源来操作数据库中的persistent_logins表

token-validity-seconds表示rememberme的有效时间,以秒为单位,这里的86400=24*3600表示一天

(3)测试

启动工程,进行登录,登录成功后会在persistent_logins表中生成一条记录,

a9e15e5f3d2842391e3df0e369d38c30.png

关闭浏览器再次访问时会根据浏览器中携带的cookie值来查找数据库中的这条记录,如果查询到了就认证通过

三、区分是密码登录还是rememberme登录

在用户进行一些敏感操作时,需要区分是否是rememberme登录,如果是需要让用户跳转到登录页面。

在congtroller层提供一个方法来进行判断

@GetMapping("/isRemembermeUser")

public boolean isRemembermeUser(){

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

if(authentication==null){

return false;

}

//判断当前用户是否是通过rememberme登录,是返回true,否返回false

return RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass());

}

先使用密码登录,访问http://localhost/user/isRemembermeUser.do,后台接口返回false,再关闭浏览器再次访问这个地址,后台接口返回true,表示这次是使用rememberme进行的认证。

测试工程代码的地址:工程示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值