替换Servlet容器的HttpSession实现集群中Session共享(With Redis)

2024-04-21 05:18

本文主要是介绍替换Servlet容器的HttpSession实现集群中Session共享(With Redis),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是我个人在开发web-security 安全框架中使用的方案。
在Web Server集群环境中需要实现 session 共享,一个很好的方法就是将 session 数据存放至 Redis 中。我打算在自己的安全框架中集成此功能,只需要几行配置就能自动让你的 web 项目集成 redis session 共享功能。

实现思路为:

将 Servlet 容器的HttpSession实现替换成自己的实现, 如RedisHttpSession。这样当在Controlelr中调用session.setAttr()此类方法时就可以执行自己的代码。我们编写一个Filter, 在调用chain.doFilter(req, resp)时,将HttpServletRequest对象替换成我们自定义的SecurityServletRequestWrapper对象,并重写getSession()getSession(boolean)方法,让其返回我们自己的session对象,这样就完成了对session的完全控制 。

替换 Servlet 容器的 HttpSession 实现

首选需要编写SecurityServletRequestWrapper类:

public class SecurityServletRequestWrapper extends HttpServletRequestWrapper {private static Logger log = LoggerFactory.getLogger(SecurityServletRequestWrapper.class);private HttpSession session;public SecurityServletRequestWrapper(HttpServletRequest request, HttpSession session) {super(request);if (null != session) {this.session = session;}}@Overridepublic HttpSession getSession() {log.debug("getSession() invoked!");return getSession(true);}/*** 返回自定义的HttpSession实现* @param create* @return*/@Overridepublic HttpSession getSession(boolean create) {log.debug("getSession(boolean) invoked!");if (create && null == session) {log.debug("creating new Session object!");session = new NativeHttpSession(getServletContext());}return session;}
}

然后,编写一个filter, 用我们刚刚完成的SecurityHttpServetRequest替换掉doFilter()方法中的第一个参数,代码大致如下:

/*** 遍历filters, 依次执行每一个过虑器*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;// 将request对象替换成自定义的wrapper对象req = new SecurityServletRequestWrapper(req, session);chain.doFilter(req, response);}

我们必须保证在请求到来时,该过滤器第一个被调用,请求完成后,该过虑器最后被调用。这样我们便可以在chain.doFilter()之前 添加从 Redis 中读取 session的代码,在chain.doFilter()之后添加刷新 session 至 redis 的代码:

@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;// 如果开启了session cluster// 执行session cluster相关逻辑if (PageProtectionContextListener.SESSION_CLUSTER) {// 尝试从存储仓库中查询sessionHttpSession session = sessionDAO.loadSession(getSid(req));logger.debug("session loaded, result => {}", session);// 将request对象替换成自定义的wrapper对象req = new SecurityServletRequestWrapper(req, session);}chain.doFilter(req, response);// 执行session cluster相关逻辑if (PageProtectionContextListener.SESSION_CLUSTER) {// 刷新session数据// 先判断有无sessionHttpSession session = req.getSession(false);// 如果没有session, 不做任何处理if (null == session) {return;}if (false == session instanceof NativeHttpSession) {throw new UnsupportedFilterException("filter " + session.getClass() + " unsupported!");}NativeHttpSession nativeSession = (NativeHttpSession) session;if (nativeSession.isDirty()) {logger.debug("flushing session");sessionDAO.flushSession(nativeSession);}}}

以上是整体实现思路和关键代码的实现,我们可以在此基础上,根据实际需求添加自己系统需要的功能。

这篇关于替换Servlet容器的HttpSession实现集群中Session共享(With Redis)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922234

相关文章

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Spring Security介绍及配置实现代码

《SpringSecurity介绍及配置实现代码》SpringSecurity是一个功能强大的Java安全框架,它提供了全面的安全认证(Authentication)和授权(Authorizatio... 目录简介Spring Security配置配置实现代码简介Spring Security是一个功能强

SpringCloud使用Nacos 配置中心实现配置自动刷新功能使用

《SpringCloud使用Nacos配置中心实现配置自动刷新功能使用》SpringCloud项目中使用Nacos作为配置中心可以方便开发及运维人员随时查看配置信息,及配置共享,并且Nacos支持配... 目录前言一、Nacos中集中配置方式?二、使用步骤1.使用$Value 注解2.使用@Configur

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re