普通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.rhkb.cn/news/452108.html

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

相关文章

gaussdb 主备 8 数据库安全学习

1 用户及权限 1.1 默认权限机制-未开启三权分立 1.1.1 数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后&#xff0c;默认只有对象所有者或者系统管理员可以查询、修改和销毁对象&#xff0c;以及通过GRANT将对象的权限授予其他用户。 1.1.2 GaussDB支持以下的…

【C51】单片机与LED数码管的静态显示接口案例分析

目录 ---案例需求--- 1、电路设计 2、程序 3、元器件清单 4、程序仿真 LED数码管有静态显示和动态显示两种显示方式。静态显示是指无论有多少位LE数码管&#xff0c;其都同处于显示状态。数码管工作于静态显示方式时&#xff0c;各位的共阴极&#xff08;或共阳极&#xf…

“网络协议入门:HTTP通信的四大组成部分“

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词: 春水满四泽&#xff0c;夏云多奇峰&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微…

USART串口(发送和接收)

目录 一. USART串口协议 二. USART串口外设 三. 串口发送接收 四. 效果展示 一. USART串口协议 USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器。 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统。…

端点物联网学习资源合集

端点物联网 学习资源合集 导航 1. 物联网实战--入门篇 文章链接 简介&#xff1a;物联网是一个包罗万象的行业和方向&#xff0c;知识碎片严重&#xff0c;本系列文章通过 边学边用 的思想&#xff0c;逐步建立学习者的信心和兴趣&#xff0c;从而进行更深入透彻的学习和探索…

kaptcha依赖maven无法拉取的问题

老依赖了&#xff0c;就是无法拉取&#xff0c;也不知道为什么&#xff0c;就是用maven一直拉去不成功&#xff0c;还以为是魔法的原因&#xff0c;试了好久发现不是&#xff0c;只好在百度寻求帮助了&#xff0c;好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…

信息安全工程师(57)网络安全漏洞扫描技术与应用

一、网络安全漏洞扫描技术概述 网络安全漏洞扫描技术是一种可以自动检测计算机系统和网络设备中存在的漏洞和弱点的技术。它通过使用特定的方法和工具&#xff0c;模拟攻击者的攻击方式&#xff0c;从而检测存在的漏洞和弱点。这种技术可以帮助组织及时发现并修补漏洞&#xff…

衡石分析平台系统分析人员手册-可视化报表仪表盘

仪表盘​ 仪表盘是数据分析最终展现形式&#xff0c;是数据分析的终极展现。 应用由一个或多个仪表盘展示&#xff0c;多个仪表盘之间有业务关联。 仪表盘编辑​ 图表列表​ 打开仪表盘后&#xff0c;就会看到该仪表盘中所有的图表。 调整图表布局​ 将鼠标移动到图表上拖动…

到底是微服务,还是SOA?

引言&#xff1a;大概正式工作有5年了&#xff0c;换了三个大厂【也是真特么世道艰难&#xff0c;中国互联网人才饱和了】。基本上每个公司有的架构都不太相同&#xff0c;干过TOC和TOB的业务&#xff0c;但是大家用的架构都不太相同。有坚持ALL in one的SB&#xff0c;最后服务…

2024项目管理软件,不融入敏捷开发怎么行?

一、项目管理软件的重要性 在当今快节奏的商业环境中&#xff0c;项目管理软件的重要性愈发凸显。随着市场竞争的不断加剧&#xff0c;企业面临着越来越多的挑战&#xff0c;项目的复杂性和不确定性也在不断增加。在这样的背景下&#xff0c;项目管理软件成为了团队高效规划、…

大模型涌现判定

什么是大模型&#xff1f; 大模型&#xff1a;是“规模足够大&#xff0c;训练足够充分&#xff0c;出现了涌现”的深度学习系统&#xff1b; 大模型技术的革命性&#xff1a;延申了人的器官的功能&#xff0c;带来了生产效率量级提升&#xff0c;展现了AGI的可行路径&#x…

◇【论文_20151120_20160405v3】Dueling Network 决斗〔Google DeepMind〕

整理代码&#xff1a;Dueling_DQN__Pendulum_v1.ipynb https://arxiv.org/abs/1511.06581 Dueling Network Architectures for Deep Reinforcement Learning 文章目录 摘要1. 引言1.1. 相关工作 2. 背景2.1. Deep Q-networks 【DQN】2.2. Double Deep Q-networks 【DDQN】2.3…

Linux基础项目开发day05:量产工具——页面系统

文章目录 一、数据结构抽象page_manager.h 二、页面管理器page_manager.c 三、单元测试1、main.page.c2、page_test.c3、Makefile修改3.1、unittest中的Makefile3.2、page中的Makefile 四、上机实验 前言 前面实现了显示、输入、文字、UI系统&#xff0c;现在我们就来实现页面的…

HCIP--1实验DNS,VLAN,静态路由,浮动静态,动态路由协议,Telnet

学习目标&#xff1a; 静态路由,浮动静态 VLAN&#xff0c;vlan间路由TelnetACL NAT OSPF/RIP 学习内容&#xff1a; 实验拓扑实验需求实验需求分析实验配置内容 &#xff08;每一个设备的每一步操作&#xff09;实验结果验证 1.实验拓扑 2.实验需求 1&#xff0c;学校内部…

Qt键盘按下事件和定时器事件及事件的接收和忽略

定时器事件 //设置多少毫秒调用一次 1s1000timerId this->startTimer(1000);timerId2 this->startTimer(500);void MyWidget::timerEvent(QTimerEvent* t) {static int sec 0;//通过判断当前ID来实现不同定时器的调用时间if(t->timerId() this->timerId){//隔一…

IDEA中的快捷键大全--超详细

目录 一、通用类型 1.1 图示 1.2 表格化 二、编写速度提升 2.1 图示 2.1.1 表格化 2.2 图示 2.2.1 表格化: 三、类结构,查找和查看源码 3.1 图示 3.2 表格化 四、查找,替换和关闭 4.1图示 4.2 表格化 五、调整格式 5.1 图示 5.2 表格化 六、快捷键的自主定义…

【C】数组(array)

数组(array) 数组的概念 数组是一组相同类型元素的集合 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0数组中存放的多个数据&#xff0c;类型是相同的 数组分为一维数组和多维数组&#xff0c;多维数组一般比较多见的是二维数组 一维数组的创建和初始…

递归神经网络解释(RNN)

Recurrent Neural Network (RNN) 如今,不同的机器学习技术用于处理不同类型的数据。最难处理和预测的数据类型之一是顺序数据。顺序数据与其他类型的数据不同,因为虽然可以假设典型数据集的所有特征都是与顺序无关的,但不能假设顺序数据集是无关的。为了处理这种类型的数据…

Kibana可视化Dashboard如何基于字段是否包含某关键词进行过滤

kinana是一个功能强大、可对Elasticsearch数据进行可视化的开源工具。 我们在dashboard创建可视化时&#xff0c;有时需要将某个index里数据的某个字段根据是否包含某些特定关键词进行过滤&#xff0c;这个时候就可以用到lens里的filter功能很方便地进行操作。 如上图所示&…

【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑

&#xff08;一&#xff09;启动 创建环境python3.9 打开此环境终端 &#xff08;后面的语句操作几乎都在这个终端执行&#xff09; 输入up主提供的语句&#xff1a;pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址&#xff1a; Start Locally | P…