【Session】关于在用户退出登录的时候清除相关session信息

SpringBoot教程:使用Java实现登出功能,删除Redis中的缓存session和清空Cookies 本篇文章将演示如何使用Spring Boot框架和Java语言来实现用户登出功能,并通过删除Redis中的缓存session和清空Cookies来确保用户安全退出。本文演示了如何使用Spring Boot框架和Java语言来实现用户登出功能。希望本文能够帮助你理解和实现这一功能。SpringBoot教程:使用Java实现登出功能,删除Redis中的缓存session和清空Cookies。源代码:https://github.com/example/spring-boot-logout-demo。 阅读详情
AI摘要

本文探讨了在用户退出系统时,如何确保session信息的安全清除,防止信息泄露。介绍了两种清除session的方法,以及利用Redis和ThreadLocal来进一步增强安全性,确保每次请求都能验证用户登录状态。

在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息。清除session信息主要有两种方式,一种是遍历的清除session中的所有属性,另一种是直接设置session失效,两种方式都要在退出的接口中实现,附代码:

		   HttpSession session = request.getSession();
           /* 清除session的方案一 */
           Enumeration attributeNames = request.getSession().getAttributeNames();
           while (attributeNames.hasMoreElements()) {
               session.removeAttribute(attributeNames.nextElement().toString());
           }
           /* 清除session的方案二 */
           session.invalidate();

到这里好像结束了,因为session已经被正确的清除。但是设想一种场景,当用户点击退出的时候,这里记录请求为request1,调用退出接口并清除了相关的session,但是如果用户此刻复制了目标路径,新建了一个窗口,回车进入,此时其实是另一个请求request2了,就是说上一步清除的session信息其实是request1,而request2请求将能正常登入系统。那么应该怎么做呢?这里有两种方案,一是利用Redis,二是采用ThreadLocal。

Redis解决方案

思路:在Redis为每个用户登录的用户名维护一条记录,一定要设置过期时间,一般一个小时。用户每次登录的时候,通过通过拦截器从缓存中查询用户名,如果没有命中,则认为用户未登录过或者登录信息已经失效,引导用户重新登录,用户正确登录之后通过setnx()方法将用户名插入缓存。用户每次点击退出时,清除本次请求的session信息,并同时将缓存中记录用户名的key同步的删除。

Tips:
setnx()也被经常用作分布式锁,具体可参看博客:
【分布式锁】并发场景下的数据插入

接下来附上利用Redis维护、删除用户登录信息的部分代码:

	/* 缓存里记录用户名的key */
	private static final String USERNAME = "username_";
    public ModelAndView login(HttpServletRequest request,
                              @RequestParam(value = "username", required = true) String username,
                              @RequestParam(value = "password", required = true) String password) {
        ……
        String key = USERNAME + username;
        /* 把用户信息设置进缓存并设置过期时间 */
        redisCacheService.setnx(key, username);
        redisCacheService.expire(key, 60 * 60);
        ……
    }

    public ModelAndView logout(HttpServletRequest request, @ApiParam("用户名") @RequestParam(value = "username", required = true) String username) {
        ……
        HttpSession session = request.getSession();
        session.invalidate();
        /* 清除本地缓存 */
        String key = USERNAME + username;
        redisCacheService.remove(key);
        ……
    }
    

然后在登录拦截器中设置每次从request中获取到用户信息之后,再和Redis中的去比较,如果缓存中没有命中,则视本次请求中的用户登录信息已经过期,需要跳转到登录页面。

import org.apache.commons.lang3.StringUtils;
public class LoginInterceptor implements HandlerInterceptor {
	/* 缓存里记录用户名的key */
    private static final String USERNAME = "username_";

	 @Override
    public boolean preHandle(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Object o) throws Exception {
        servletRequest.setCharacterEncoding("UTF-8");
        servletResponse.setContentType("application/json;charset=utf-8");
        ServletOutputStream outputStream = servletResponse.getOutputStream();

        HttpSession session = servletRequest.getSession();
        Object userNameObject = session.getAttribute("userName");
        String userName = userNameObject != null ? userNameObject.toString() : null;
        if (userName == null) {
            servletResponse.setStatus(HttpServletResponse.SC_OK);
            String res="登录失败,未获取到用户登录信息~";
            outputStream.write(JsonUtils.toJson(res).getBytes("UTF-8"));
            return false;
        }
        /* 和本地缓存中的比较 */
        String key = USERNAME + userName;
        String value = (String) redisCacheService.get(key, String.class, new CacheCallable() {
            @Override
            public Object getCacheValue() throws Exception {
                return null;
            }
        });
        /* 若未命中缓存,说明用户登录信息已失效,引导用户重新登录 */
        if (StringUtils.isBlank(value)) {
            return false;
        }
        return true;
    }
}

ThreadLocal解决方案

待补充。

参考阅读
如何解决每次向后台发起请求时判断用户是否处于登录状态?
Stata实战:RCS限制立方样条非线性关系建模与P值解读全攻略 本文详细介绍了在Stata中使用RCS限制立方样条进行非线性关系建模的全过程,包括数据准备、节点设置、COX回归模型构建、结果可视化及P值解读。通过乳腺癌临床数据实例,展示了如何捕捉年龄与死亡风险之间的复杂非线性关系,并提供了实用的Stata代码和图形优化技巧。 阅读详情

相关推荐

macOS安装Cplex+yalmip

macOS安装Cplex+yalmip

DS 4248

session和cookie实现用户自动登录和退出清除缓存

利用session和cookie的缓存机制,实现自动登录,不用多次认证。以及清除缓存功能

m0_73402102的博客 5710

【Anaconda】conda国内镜像源快速配置指南(清华/阿里云)

本文详细介绍了如何为Anaconda配置国内镜像源(清华/阿里云),以显著提升conda包下载速度并减少安装失败率。通过分步指南和实用技巧,帮助开发者快速完成配置,优化Python开发环境。

weixin_33725722的博客 1486

退出登录时清空session中的数据

退出登录时如何清空session中的数据

M_emory_的博客 6021

STM32F103C8T6的PC13-15引脚配置避坑指南:为什么你的IO口不工作?

本文详细解析了STM32F103C8T6的PC13-15引脚作为普通IO口不工作的原因及解决方案。这三个引脚默认关联侵入检测和低速外部时钟等特殊功能,需先禁用TAMPER和LSE,并开启AFIO时钟,才能正确配置为普通GPIO。文章提供了标准外设库和HAL库的配置步骤、常见问题排查方法及硬件设计注意事项。

weixin_29169899的博客 522

python 成语接龙-连接数据库

from xpinyin import Pinyin import pymysql while 1: conn = pymysql.connect( host='localhost', #本地连接 user='root', #数据库账户名 password='password', #数据库密码 db='dic',

Hero2902的博客 598

跨域session清除问题 平台退出登录以后子系统清除session的方案

最近被外地的同事问到一个问题:平台网站退出登录以后,无法清除子系统的session,大致过程是这样的,点击平台上的功能按钮进入子系统,模拟登录,成功后可以使用子系统的所有功能。平台点击退出的时候平台服务器发送一个post请求,请求子系统清除session。 听了问题以后首先考虑的是跨域导致找不到登录时候保存的session。 解决思路:将问题拆分, ...

scujinxiang的专栏 1737

UReport2 报表设计器 在线表格

UReport2官网 一、UReport2报表设计器 UReport2是一个开源的可视化报表设计器,功能强大,操作简单,可以实现复杂的报表统计,有各种各样的导出和打印功能,支持导入Excel表格! 1、报表设计器 2、设计一个简单的用户列表展示 二、可编辑表格 扩展了layui的表格,支持多元化数据编辑(单选,多些、日期、下拉联动),开发简单、高效、便捷。有了它就可以轻松开发类似进销存系统的表格录入功能了,用户拿来即用! 三、主从表录......

ejinxian的专栏 2万+

关于退出系统时,清除session

在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息。         清除session对象内容的主要方法如下:         (1)、removeAttribute()方法。该方法是用来删除session对象中保存的指定属性信息。         例如:sessi

qq_23476319的博客 7万+

深入解析iDP3的Learning模块:从数据集构建到3D动作预测的代码实现

本文深入解析iDP3框架的Learning模块,从数据集构建到3D动作预测的完整代码实现。通过扩散模型实现视觉输入到动作序列的端到端预测,详细介绍数据采集、增强策略、模型架构及训练技巧,帮助开发者掌握3D动作预测策略的核心技术。

k0l1m2n3o的博客 310

OSG程序如何适配在无显卡的Ubuntu系统中

osg踩坑,希望遇到同样问题的人,可以尽快出坑,完美开发

大侠的后花园 459

怎样在php中退出登录,php如何实现退出登录功能

php如何实现退出登录功能发布时间:2020-10-09 15:45:55来源:亿速云阅读:74作者:小新php如何实现退出登录功能?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!方法:首先通过“if(isset($_SESSION["变量"])) ”检测变量是否存在;如果存在,则使用session_unset()和...

weixin_36170766的博客 1503

视源CVTE嵌入式面试题及参考答案(200+面试题,17万字)

内核模块如何设置? 内核模块是可在运行时动态加载到内核或从内核卸载的代码块。以下是设置内核模块的步骤: 首先,编写内核模块代码。通常使用 C 语言编写,包含必要的头文件,如<linux/init.h>、<linux/module.h>等。在代码中,需要定义模块的初始化函数和清理函数。初始化函数在模块加载时被调用,用于进行模块的初始化工作,如注册设备、分配资源等。清理函数在模块卸载时被调用,用于释放资源、注销设备等。 例如: #include <li

大模型大数据攻城狮的专栏 2204

JavaWeb 自动登录和退出(图解代码执行流程)

通过图解执行流程以及对cookie和session的使用,实现用户自动登录和退出功能

阿顾的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

项目中如何利用Cookie和Session实现用户的自动登录和购物车的存储

如何利用Cookie实现用户的自动登录: 功能展示: 点击我的账号未登录需要先登录 登录后: 重启服务器:点击我的账号直接进入不需要登录 实现过程: 我的账号: //我的账户 @RequestMapping("/myAccount") public String myAccount(HttpSession session,HttpServletRequest request){ //先从session中获取login_user,只有成功登录

weixin_42383680的博客 578

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

html 保存登录状态,HTML-如何安全的设计登录系统中的”记住密码“功能?

比较常用的处理方式,使用session,cookies来记住密码,实现如下:一、检查用户是否登录//检查用户是否登录function checklogin(){if(empty($_SESSION['user_info'])){ //检查一下session是不是为空if(empty($_COOKIE['username']) || empty($_COOKIE['password'])){ ...

weixin_28808145的博客 767

java如何确定用户已经登录_java 验证用户是否已经登录与实现自动登录方法详解...

验证用户是否已经登录package cn.hongxin.filter;import java.io.ioexception;import javax.servlet.filter;import javax.servlet.filterchain;import javax.servlet.filterconfig;import javax.servlet.servletexception;impo...

weixin_34321609的博客 2758

php中实现记住密码自动登录的代码

php实现记住密码自动登录方法不止一个,下面出现有二个emptyempty,其实是一个,那是因为代码高亮有bug。希望对大家有帮助。 一,用户登录的check  复制代码 代码如下: //检查用户是否登录  function checklogin(){  if(emptyempty($_SESSION['user_info'])){ //检查一下session是不

并肩 900

java web监听当前登录用户人数

本文主要使用java web的HttpSessionAttributeListener监听器监听当前登录的用户,总体思路就是用户登录的时候讲登录信息存到session当中,监听器监听到session当中增加了这个属性之后就将当前登录人的信息存到上下文当中,当用户退出或者session失效的时候,监听器同样会监听到这一动作,把上下文当中的这个用户信息删除即可........以下是代码实现: 1.m

时光伴我久的专栏 1380

Shiro退出机制是什么?

实现步骤如下,首先在Shiro配置文件下注明/logout=logout,这样当访问根路径logout时,可以直接跳转到logout的逻辑代码中去,在logout的contrller中需要利用session的 getAttributeNames方法进行获取内容,然后使用while循环调取session的删除方法将session作用域中的内容全部删除,然后再利用subject的api getsubject方法获取subject的内容,然后调取logout方法进行删除subject内容。

m0_65467786的博客 373

cookie自动登录 php,php中session和cookie实现自动登录

文章先是给各位普及一下关于cookie与session的两个例子,然后再以利用cookie自动登录为例子给大家介绍了它们之间的关系及后面总结了区别,希望此文章对你理解cookie与session会有所帮助。session的使用:session_start();定义$_SESSION数组变量。session_start()使用前,不能有任何形式的输出,包括php中的输出和html代码。$_SESSI...

weixin_29655399的博客 504

状态保持login()和状态清除logout()

如果需求是注册成功后即表示用户认证通过,那么此时可以在注册成功后实现状态保持 login( ) 方法介绍: 状态保持: 将通过认证的用户的唯一标识信息(比如:用户ID)写入到当前 session 会话中 login( ) 方法: Django 用户认证系统提供了 login() 方法 封装了写入 session 的操作,帮助我们快速实现状态保持 login( ) 位置: django....

weixin_30797199的博客 667

javaee 过滤器加cookie实现自动登录

如上图,如果勾选了自动登录,在登录时,就将用户名和密码存储到cookie中,当下次访问首页时,过滤器先拦截请求,获取下cookie中的账号密码,然后如果cookie中的账号密码有效就将登录信息存储到session中。

道友 727

若依项目如何实现一个账户只能一个人登录(即,限制账户不允许多终端登录)

1、application.yml新增一个配置soloLogin用于限制多终端同时登录。 2、Constants.java新增一个常量LOGIN_USERID_KEY公用。 3、调整TokenService.java,存储&刷新缓存用户编号信息。 4、自定义退出处理类LogoutSuccessHandlerImpl.java清除缓存方法添加用户编号。 5、登录方法SysLoginService.java,验证如果用户不允许多终端同时登录,清除缓存信息。

weixin_46119090的博客 6666

php 和.net的cookies,详解PHP中cookie和session的区别及cookie和session用法小结

具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的cookie 是通过扩展http协议实现的cookie 主要包括 :名字,值,过期时间,路径和域;如果cookie不设置生命周期,则以浏览器关闭而关闭,这种cookie一般存储在内存而不是硬盘上.若设置了生命周期则相反,不随浏览器的关闭而消失,这些cookie仍然有效直到超过设定的过 期 时间。session 一种类...

weixin_35851553的博客 109

通过servlet的filter过滤器以及Cookie、JDBC数据库连接技术实现用户的30天内自动登录,以及Ajax实现用户名是否可用校验

Cookie、JDBC数据库连接技术实现用户的30天内自动登录

qq_66013742的博客 694
上一篇: 【Java基础】HashMap底层实现原理 附源码分析及面试题,带你深入Java集合
下一篇: 【Java基础】ConcurrentHashMap原理分析及应用
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值