普通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,一经查实,立即删除!

相关文章

宏观经济分析应该看哪些指标?

文章目录 1.国内生产总值(GDP)1.1 GDP(国内生产总值)2. 失业率2.1 城镇登记失业率2.2 调查失业率2.3 青年失业率2.4 长期失业率3. 通货膨胀率3.1 CPI(消费者物价指数):3.2 PPI(生产者物价指数):4. 利率4.1 贷款市场报价利率(LPR)4.2 金融机构贷款基准利率4.3 存款基…

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;总算有点收…

操作系统(6) (Named /Unnamed Semaphore信号量详解)

目录 1: 信号量的基本概念 2: 命名信号量的示例代码 3. 无名信号量&#xff08;Unnamed Semaphore&#xff09; 背景&#xff08;Background&#xff09; 示例代码讲解 初始化无名信号量 线程函数 创建线程并等待完成 销毁信号量 总结 4. 对比 1: 信号量的基本概念 背…

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

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

JS-常用功能

前言 在工作中&#xff0c;有些js功能经常需要用到&#xff0c;但是在真正用的时候&#xff0c;每次都是百度。可能一时半会还找不到正确的。所以这里把经常用到的js功能&#xff0c;汇总一下&#xff0c;后续还会继续完善。 目录 input只能输入0~100&#xff0c;并且是正整…

STM32-CubeIDE用串口通讯

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

C++中库和包的区别

在C开发中&#xff0c;“库”&#xff08;Library&#xff09;和“包”&#xff08;Package&#xff09;是两个常见但有不同含义的术语。理解它们之间的区别有助于更有效地管理和使用代码资源。 库&#xff08;Library&#xff09; 定义&#xff1a; 库是预先编译好的代码集合…

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

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

【嵌入式设备】蓝牙鼠标遥控器

今天讲的这个产品也是刚开发的 主要就是可以遥控你的设备&#xff0c;进行一些自动化的操作流程&#xff0c;不需要再一个一个去单独进行操作&#xff0c;举个最简单的例子&#xff0c;比如你需要拨打一个电话号&#xff0c;你是不是需要一个一个数字去按&#xff0c;最终按下…

如果有100万条消息堆积在MQ怎么解决

当 RabbitMQ 中有 100 万条消息堆积时&#xff0c;意味着消息处理速度已经明显落后于消息产生的速度。如果不及时解决&#xff0c;可能会导致系统负载过重、消息处理延迟加剧&#xff0c;甚至系统崩溃。为了解决这种大规模消息堆积问题&#xff0c;可以采取以下几种措施&#x…

如何在Matlab界面中添加日期选择器?

在Matlab界面中添加日期选择器&#xff0c;可以让用户通过图形界面方便地选择日期。Matlab提供了uidatepicker函数&#xff0c;允许用户在App Designer设计的GUI中添加日期选择器组件。以下是如何在Matlab界面中添加日期选择器的详细步骤&#xff1a; 1. 使用App Designer添加…

重写QObjiet虚函数timerEvent()启动定时器

重写QObjiet虚函数timerEvent()启动定时器是一个常见的方法&#xff0c;它允许在Qt应用程序中实现定时功能。下面是一个简单的例子&#xff0c;展示了如何重写timerEvent()并启动定时器&#xff1a; 首先&#xff0c;创建一个继承自QObject的类&#xff0c;并在该类中重写time…

基于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.双指针的…