普通java web项目集成spring-session

之前的老项目,希望使用spring-session管理会话,存储到redis。

项目环境:eclipse、jdk8、jetty嵌入式启动、非spring项目。

实现思路:

1.添加相关依赖jar。

2.配置redis连接。

3.配置启动spring。

4.配置过滤器,拦截替换HttpSession,使用spring-session的实现。

5.启动测试。

具体操作:

1.添加相关依赖jar。

有2中方式:

一种是将项目转为maven或者gradle等类型项目。如maven,就可以通过配置pom.xml管理依赖。

优点:目前主流的方式都是通过构建工具管理依赖,很多文档也是针对构建工具写的。对以后升级扩展都比较方便。

缺点:项目比较老,比较大,涉及到的jar有170多个。转为maven编写pom比较麻烦。

一种是直接将相关的jar拷贝到lib目录下。

优点:只要知道需要依赖哪些jar,就直接拷贝进去就可以了。操作简单直接。

缺点:不能直接知道需要哪些jar。具体到本次升级,一种比较好的做法是根据文档创建一个maven项目,测试运行通过后,将需要的jar拷贝过去。但以后升级扩展面临类似问题。

本次升级我采用的是第一种方案。希望一劳永逸的解决,同时引入spring。

首先将项目转换为maven项目。具体参考:普通java web项目转为maven项目

然后添加依赖:点击查看官方文档:spring-session基于xml配置

<!-- 添加spring-session-redis依赖 --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>2.6.4</version></dependency><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.1.8.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.29</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.29</version></dependency>

需要注意的几个点:

1.根据jdk版本选择对应版本。jdk8对于spring-session-data-redis版本最高为2.X.X。3.X版本要求jdk版本大于jdk8。org.springframework版本最高5.X。6.X版本要求jdk版本大于jdk8。

2.官方文档spring-session-data-redis下面配置了<type>pom</type>,这个要去掉,否则会报找不到类org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration

3.需要添加spring-context依赖,否则注解不生效。虽然我们用的是基于xml配置,但是还是会用到了注解。

2.配置redis连接。

根据官方文件,创建EmbeddedRedisConfig类,并根据实际情况进行修改。

package com.xpl.jfinal;import org.apache.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Profile;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.web.context.ContextLoaderListener;import com.xpl.util.ConfigUtil;@Configuration
//@Profile("embedded-redis")  //取消Profile注解,否则启动时可能不生效
public class EmbeddedRedisConfig {private final Logger logger = Logger.getLogger("");@Bean@Primarypublic LettuceConnectionFactory redisConnectionFactory() {logger.info("连接redis");RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(ConfigUtil.getValue("redis_host"));redisConfig.setPassword(ConfigUtil.getValue("redis_password"));return new LettuceConnectionFactory(redisConfig);}}

注意:@Profile注解可能导致项目启动时配置不生效。在这里我们直接注释掉不影响我们使用。

3.配置启动spring。

启动spring需要我们配置spring的上下文和配置web.xml。

首先创建spring的配置文件。/WEB-INF/spring/session.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/><bean class="com.xpl.jfinal.EmbeddedRedisConfig"/><bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/><bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/></beans>

注意:官方文档中配置中没有bean   com.xpl.jfinal.EmbeddedRedisConfig,导致redis配置没生效。这里需要手动配置下EmbeddedRedisConfig。

然后配置web.xml

<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/session.xml</param-value></context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

4.配置过滤器。

	<filter><filter-name>springSessionRepositoryFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSessionRepositoryFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>ERROR</dispatcher></filter-mapping>

5.启动测试。

// src/main/java/sample/SessionServlet.java
public class SessionServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {String attributeName = req.getParameter("attributeName");String attributeValue = req.getParameter("attributeValue");req.getSession().setAttribute(attributeName, attributeValue);resp.sendRedirect(req.getContextPath() + "/");}private static final long serialVersionUID = 2878267318695777395L;}

启动测试发现没有加载spring,后面分析得出原因是依赖冲突导致的。以前项目中包含了slf4j-api-1.7.25.jar,引入的spring也依赖slf4j-api-1.7.32。解决办法直接把老的jar依赖删除。然后重新测试成功。

测试其实通过上面方法方法,还可以通过第一次启动登录后,访问需要登录后才有权限访问的页面,此时页面能正常打开,然后关闭应用,重新启动应用,此时再访问需要登录后才有权限访问的页面,如果能正常访问,这说明集成成功,会话保存到redis了,如果提示没有权限,则说明会话未保存到redis。

6.总结

涉及到修改的文件有:

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

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

相关文章

L1练习-鸢尾花数据集处理(分类/聚类)

背景 前文&#xff08;《AI 自学 Lesson1 - Sklearn&#xff08;开源Python机器学习包&#xff09;》&#xff09;以鸢尾花数据集的处理为例&#xff0c;本文将完善其代码&#xff0c;在使用 sklearn 的部分工具包基础上&#xff0c;增加部分数据预处理、数据分析和数据可视化…

QUIC 协议的优势

QUIC 协议的优势包括&#xff1a; 快速建立连接&#xff1a;将传输层和加密层的握手合并&#xff0c;减少了连接建立的延迟。QUIC 建连时间大约为 0~1RTT&#xff0c;相比 HTTPS 的 3RTT 建连&#xff0c;具有极大的优势。客户端第一次建连的握手协商需 1RTT&#xff0c;而已建…

Linux 和Windows创建共享文件夹实现文件共享

直接开整 1.Windows下创建共享文件夹share右击-》属性—》共享-》选择所有人-》点击共享 2.共享创建完成后可以使他的共享网络地址或者Windows ip地址-推荐使用Windows ip地址有时候 不知道什么原因他Linux解析不了网络地址 共享网络地址 —共享文件夹share 右击-》属性—》共…

扫普通链接二维码打开小程序

1. 2.新增规则&#xff08;注意下载文件到跟目录下&#xff0c;需要建个文件夹放下载的校验文件&#xff09; 3.发布 ps&#xff1a;发布后&#xff0c;只能访问正式版本。体验版本如果加了 测试链接http://xxx/xsc/10 那么http://xxx/xsc/aa.....应该都能访问 例如aa101 aa…

CMOS晶体管的串联与并联

CMOS晶体管的串联与并联 前言 对于mos管的串联和并联&#xff0c;一直没有整明白&#xff0c;特别是设计到EDA软件中&#xff0c;关于MOS的M和F参数&#xff0c;就更困惑了&#xff0c;今天看了许多资料以及在EDA软件上验证了电路结构与版图的对应关系&#xff0c;总算有点收…

VScode中CMake无高亮(就是没有补全的提示)

在我学的过程中我发现我的CMake是这样的&#xff0c;如下图 但在教学视频里是这样的&#xff08;如下图&#xff09; 这非常的难受&#xff0c;所以疯狂的找&#xff0c;最后是CMake报错有 原因就是&#xff1a;本地没有配置环境变量&#xff0c;解决方法是下一个cmake然后直接…

STM32-CubeIDE用串口通讯

USART串口通讯 一、轮询模式 1.设置所接引脚为UART异步模式 选择完成CTRLS保存。 2.编写测试代码&#xff08;自动发送hello world&#xff09; 在mian函数里面编写代码 原函数 调用函数&#xff0c;需要数据类型一致&#xff0c;使用函数通过串口发送数组里面的数据 打开串…

延迟队列实现及其原理详解

1.绪论 本文主要讲解常见的几种延迟队列的实现方式&#xff0c;以及其原理。 2.延迟队列的使用场景 延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景&#xff0c;主要包含如下场景: 1.比如订单超过15分钟后&#xff0c;关闭未关闭的订单。 2.比如用户可以…

基于springboot+微信小程序校园自助打印管理系统(打印1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot微信小程序校园自助打印管理系统实现了管理员、店长和用户。管理员实现了用户管理、店长管理、打印店管理、打印服务管理、服务类型管理、预约打印管理和系统管理。店长实现…

vue3中报has no default export错误

原因 在同时使用Vetur和Volar插件的Vue2与Vue3项目中&#xff0c;遇到Module has no default export错误。通过在VSCode设置中将vetur.validation.script设为false&#xff0c;可以消除该报错&#xff0c;不影响实际运行。 解决办法 "vetur.validation.script": fa…

【Linux线程】Linux线程编程基础:概念、创建与管理

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux多线程 &#x1f4d2;1. 线程概念&#x1f4dc;2. 进程VS线程&#x1f4da;3. 线程控制…

算法魅力-双指针的实战

目录 1.双指针的介绍 1. 左右指针&#xff08;对撞指针&#xff09; 2. 快慢指针 2.题目练习讲解 2.1 移动零 算法思路 代码展示 画图效果效果 2.2 复写零 算法思路 代码展示 2.3 快乐数 算法思路 代码展示 2.4 盛最多水的容器 算法思路 代码展示 结束语 1.双指针的…

大模型带来新安全机遇

当前网络空间安全面临攻击隐蔽难发现、数据泄露风险高和违法信息审核难等挑战。大模型展现出强大的信息理解、知识抽取、意图和任务编排等能力&#xff0c;为网络空间安全瓶颈问题提供了新的解决思路和方法。与此同时&#xff0c;大模型发展也催生了恶意软件自动生成、深度伪造…

架构师之路-学渣到学霸历程-22

NFS文件共享服务器 今天开始了云计算-SRE架构师的第二个阶段&#xff0c; 第二阶段就是服务阶段了&#xff1b;第一个分享的就是NFS服务&#xff1b; 文件共享服务&#xff1b; 早上就了解一下NFS原理&#xff1b; 1、NFS文件共享服务器 NFS&#xff1a;就是network file sy…

【YOLO学习】YOLOv5详解

文章目录 1. 网络结构2. 结构整体描述2.1 输入端2.2 Backbone2.3 Neck2.4 Head 3. 模块细节3.1 Focus模块3.2 SPPF3.3 Bounding Box损失函数 4. 训练策略 1. 网络结构 1. 目标检测的模型框架大体都是以下图示这样的结构&#xff1a; 2. 关于 YOLOv5 的网络结构其实网上相关的讲…

数据结构 - 队列

队列也是一种操作受限的线性数据结构&#xff0c;与栈很相似。 01定义 栈的操作受限表现为只允许在队列的一端进行元素插入操作&#xff0c;在队列的另一端只允许删除操作。这一特性可以总结为先进先出&#xff08;First In First Out&#xff0c;简称FIFO&#xff09;。这意味…

R语言机器学习算法实战系列(八)逻辑回归算法 (logistic regression)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模型总结系统信息介绍 …

MySQL数据库和表的基本操作

文章目录 一、数据库的基础知识 背景知识数据库的基本操作二、数据类型 字符串类型数值类型日期类型三、表的基本操作 创建表查看表结构查看所有表删除表 一、数据库的基础知识 背景知识 MySQL是一个客户端服务器结构的程序 主动发送数据的这一方&#xff0c;客户端(client…

“智改数转”转了什么?

万界星空科技专门针对数字化改造申报的MES系统具有显著的技术优势和实施效果&#xff0c;能够为制造型企业提供全方位、高效、可靠的数字化转型支持。项目合作可以私信或者百度上海万界星空科技官网。 “智改数转”是一个综合性的过程&#xff0c;涉及企业多个方面的转型和升…

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中&#xff0c;数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而&#xff0c;随着越来越多企业依赖数据驱动决策&#xff0c;许多跨境电商平台为了保护自身数据&#xff0c;采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…