1.RememberMe简介及用法

简介: RememberMe是一种保持用户登录状态的机制,通过Cookie实现关闭浏览器后仍可自动登录,避免重复认证。其原理是在用户首次登录并勾选“记住我”后,服务端生成Token并存储于Cookie,后续请求自动携带该Token进行校验,提升用户体验同时需注意安全风险。

1.RememberMe简介及用法

1.基本简介
RememberMe功能十分常见,如下图的QQ邮箱登录时的“记住我”的功能选项。

支持QQ号/邮箱/手机号登录

微信登录

扫码快捷登录

QQ登录

下次白动登录

登录

忘了密码?

0Q密码


这里读者朋友们可能会有一个常见误区,“记住我”就是把用户的用户名/密码使用Cookie保存在浏览器,下次登录时不用再次输入,这个理解是非常不对的。
我们这里所说的RememberMe是一种服务器端的行为。传统的登录方式基于Session会话,一旦用户关闭浏览器重新打开,就要重新登录,这样太过于烦琐,如果有一种机制可以让用户关闭并重新打开浏览器之后,还能保持登录状态就会方便很多,这种实现之一就是RememberMe。
其大概实现如下面的流程所示,但是读者可能也发现这种将用户密码保存在浏览器的行为存在安全隐患。

 

打开网页登录

前端Cookie记录

用户第一次登录

 

打开网页

后端服务器

用户第二次登录

自动将Cookie发送给服务器

对Cookie信息校验

Cookie是否有效

自动进入系统

有效

 

跳转至登录页面

重新走登录流程

无效

13

2.基本用法
在前两天的内容后,我们直接在原有代码修改,增添RememberMe功能。
1.注册配置信息

Java

运行代码复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package com.yzxb.SpringSecurity.config;


import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import org.springframework.security.crypto.password.NoOpPasswordEncoder;

import org.springframework.security.crypto.password.PasswordEncoder;


@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {


   @Bean

PasswordEncoder passwordEncoder() {

return NoOpPasswordEncoder.getInstance();

}


   @Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.anyRequest().authenticated()

.and()

.formLogin()

.and()

.rememberMe()

.key("ikun")

.and()

.csrf().disable();

}


   @Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

auth.inMemoryAuthentication()

.withUser("ikun")

.password("5201314")

.roles("admin");

}

}

2.重启验证功能
此时重启项目,访问我们原来的接口:http://localhost:8080/demo/index,会发现登录窗口多了一个勾选框,当我们勾选之后,登录。之后关闭浏览器再次访问上述地址,就会发现无需重复登录了。
注意这里不要重启后端服务

REMEMBERMEONTHISCOMPUTER.

PLEASESIGNIN

SIGNIN

SERNAME

PASSWORD


那么这一切就因为多了一个勾选框就实现的流程,到底是怎么实现的呢?我们大概可以猜出来他会告诉服务端是否开启RememberMe功能,当请求后,我们会发现响应头多了一个Set-Cookie参数,如下图:

SET-COKIE:RERENBER-RE-ANF2NDVETONTIK4WLIWI4W2A1010XTNXTWFHZTG1NOGRZINLZY1MIMOTJIYJAYZTU4;NAX-IGE=128960EXPIRES=TUE,

ET-COOKIE:JSESSI0ND=C81B63662955561827D92A4C4E6B6FB;PATH=/;HTP0NLY


在响应头给了一个remember-me的字符串,以后所有的请求头Cookie字段都会自动携带这个令牌,服务端可以利用该令牌校验用户身份是否合法。
大致流程如上所述,但是读者们应该想起来我们前面说的问题了,这种令牌一旦泄露,不怀好意的Ikun们可以拿这个令牌随意访问系统,从而给系统带来风险和性能压力。怎么优化呢?
类似于我们前面的自定义认证一样,将Token持久化到DB即可。这里我们也可以做进一步的二次校验,从而保证系统的全局安全。

若有收获,就点个赞吧


相关文章
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
763 1
|
存储 缓存 网络协议
深入理解Linux网络——内核是如何接收到网络包的
一、相关实际问题 RingBuffer是什么,为什么会丢包 网络相关的硬中断、软中断是什么 Linux里的ksoftirqd内核线程是干什么
|
6月前
|
机器学习/深度学习 存储 缓存
京东按图搜索API技术实践指南
京东按图搜索API基于CV技术,通过图像预处理、ResNet50特征提取与余弦相似度匹配,实现毫秒级商品检索。支持Base64传图、类目筛选与阈值过滤,Top5准确率89.7%,日调用量1000次起。
|
7月前
|
人工智能 运维 安全
无需Mac mini!2026年4步在阿里云构建OpenClaw(Clawdbot) AI员工,零基础也能上手
2026年,AI智能体迎来规模化落地,OpenClaw(前身为Clawdbot、Moltbot)凭借“开源免费、全场景自动化、无设备限制”的核心优势,成为个人与企业构建专属AI员工的首选框架。不同于传统聊天机器人仅能提供文本建议,OpenClaw能真正实现“指令下达→任务执行”的闭环,可自动完成邮件处理、文档生成、网页抓取、日程提醒、多平台联动等重复性工作,如同7×24小时待命的全职AI员工,彻底解放人力。
737 2
|
12月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
779 137
|
开发者
鸿蒙开发:了解分割线
在实际的开发中,如果自带的分割线能够满足我们的需求,以自身的分割线属性为主,如果不满足,我们可以使用组件进行绘制。
495 16
鸿蒙开发:了解分割线
|
11月前
|
JavaScript Java 关系型数据库
基于springboot的高校运动会系统
本系统基于Spring Boot、Vue与MySQL,实现高校运动会报名、赛程安排及成绩管理的全流程信息化,提升组织效率,杜绝信息错漏与冒名顶替,推动体育赛事智能化发展。
|
9月前
|
人工智能 机器人 Java
AI场景面试题
基于150场面试统计,AI相关问题占比22%(32场)。常见问题涵盖AI模块设计、模型训练与部署(如Ollama、MaxKB)、RAG技术、千帆大模型接入、Spring AI框架、AIGC应用及模型微调等,聚焦实际项目中AI落地的技术细节与优化策略。
|
12月前
|
自然语言处理 监控 API
亚马逊:使用全球开店API实现多国站点同步运营,降低管理成本
亚马逊全球开店API助力跨境电商实现多站点自动化运营,支持商品、库存、订单一键同步,自动转换多语言多货币,实时补货与就近履约。通过四步技术方案,降低30%以上成本,提升效率90%以上,打造高效智能的全球化销售体系。
|
存储 缓存 NoSQL
分布式锁
分布式锁是分布式系统中实现跨节点资源互斥访问的关键机制,常用于解决多进程、多机器环境下的并发控制问题。它依赖外部存储(如Redis、ZooKeeper)协调锁状态,确保全局唯一性和原子性操作。常见实现包括基于Redis的单点锁与RedLock算法、ZooKeeper的临时顺序节点及数据库唯一索引。适用于任务调度、缓存重建和库存管理等场景。设计时需关注可重入性、锁超时、续租及异常处理,并权衡性能与可靠性。
532 0

热门文章

最新文章