datastore_使用Spring Session和JDBC DataStore进行会话管理

datastore

在Web应用程序中,用户会话管理对于管理用户状态至关重要。 在本文中,我们将学习在集群环境中管理用户会话所采用的方法,以及如何使用Spring Session以更简单和可扩展的方式实现该方法。

通常在生产环境中,我们将有多个服务器节点,并在它们前面有一个负载平衡器,并且所有客户端流量都将通过负载平衡器到达其中一个服务器节点。 因此,我们需要某种机制来使用户会话数据可用于集群环境中的每个客户端。
传统上,我们一直使用以下技术来管理会话:

  1. 单节点服务器
  2. 具有负载均衡器和粘性会话的多节点服务器
  3. 具有负载均衡器和会话复制的多节点服务器
  4. 持久性数据存储中具有负载均衡器和会话数据的多节点服务器

让我们简要地看一下这些方法。

1.单节点服务器

如果您的应用程序不是对您的业务至关重要的服务,那么并发用户不会太多,并且可以接受一些停机时间,那么我们可以进行单节点服务器部署,如下所示:


在此模型中,对于每个浏览器客户端,将在服务器上创建会话对象(对于Java,则为HttpSession ),并且SESSION_ID将被设置为浏览器上的cookie,以标识会话对象。 但是对于大多数应用程序来说,这种单服务器节点部署是不可接受的,因为如果服务器关闭,服务将完全关闭。

2.具有粘性会话的多节点服务器

为了使我们的应用程序高度可用并满足更多用户,我们可以在负载均衡器后面有多个服务器节点。 在“粘性会话”方法中,我们将负载均衡器配置为将所有请求从同一客户端路由到同一节点。

在此模型中,将在服务器节点中的任何一个上创建用户会话,并且来自该客户端的所有其他请求将被发送到同一节点。 但是这种方法的问题是,如果服务器节点发生故障,那么该服务器上的所有用户会话都将消失。

3.具有会话复制的多节点服务器

在此模型中,用户会话数据将在所有服务器节点上复制,以便任何请求都可以路由到任何服务器节点。 即使一个节点发生故障,客户端请求也可以由另一节点服务。

但是会话复制需要更好的硬件支持,并涉及某些服务器特定的配置。

4.具有持久数据存储区中的会话数据的多节点服务器

在此模型中,用户会话数据将不保存在服务器的内存中,而是将其持久保存到数据存储中并将其与SESSION_ID关联。

此解决方案将独立于服务器,但是每当用户向其会话中添加一些信息时,我们可能都需要编写自定义代码以将会话数据透明地存储在Persistent数据存储区中。

这是Spring Session出现的地方。

Spring会议

Spring Session是方法4的一种实现,它是将会话数据存储在持久数据存储区中。 Spring Session支持RDBMS,Redis,HazelCast,MongoDB等多个数据存储,以透明地保存使用会话数据。 像往常一样,将Spring Session与Spring Boot一起使用就像添加依赖项和配置少量属性一样简单。
让我们看看如何在Spring Boot应用程序中将Spring Session与JDBC后端存储一起使用。

https://github.com/sivaprasadreddy/spring-session-samples

步骤1:创建Spring Boot应用程序

使用具有WebThymeleafJPAH2Session starters的最新版本(撰写时为2.0.0.RC1 )创建SpringBoot应用程序。
默认情况下,Session入门程序将添加org.springframework.session:spring-session-core依赖项 ,让我们在使用JDBC后端时将其更改为spring-session- jdbc

<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-jdbc</artifactId>
</dependency>

步骤2:配置Spring Session属性

我们可以在application.properties使用spring.session.store类型的属性配置Spring会议后端数据存储的类型。

spring.session.store-type=jdbc

当我们使用H2内存数据库时,Spring Session将创建以下表,这些表用于通过脚本spring-session- jdbc -2.0.1.RELEASE.jar!/ org / springframework / session / jdbc / schema自动存储会话数据。 -h2.sql

CREATE TABLE SPRING_SESSION (PRIMARY_ID CHAR(36) NOT NULL,SESSION_ID CHAR(36) NOT NULL,CREATION_TIME BIGINT NOT NULL,LAST_ACCESS_TIME BIGINT NOT NULL,MAX_INACTIVE_INTERVAL INT NOT NULL,EXPIRY_TIME BIGINT NOT NULL,PRINCIPAL_NAME VARCHAR(100),CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
);CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);CREATE TABLE SPRING_SESSION_ATTRIBUTES (SESSION_PRIMARY_ID CHAR(36) NOT NULL,ATTRIBUTE_NAME VARCHAR(200) NOT NULL,ATTRIBUTE_BYTES LONGVARBINARY NOT NULL,CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
);CREATE INDEX SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_PRIMARY_ID);

但是,如果我们要使用其他RDBMS(例如MySQL),则可以进行如下配置:

添加MySQL Maven依赖项。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

配置MySQL的数据源属性:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=admin

使用spring.session.jdbc.initialize-schema属性启用Spring Session表创建。

spring.session.jdbc.initialize-schema=always

有了这个属性,Spring Session将尝试使用脚本“ classpath:org / springframework / session / jdbc / schema-@@ platform @@。sql”创建表,因此在本例中,它将使用schema-mysql.sql

步骤3:将资料新增至HttpSession

现在,在src / main / resources / templates / index.html中创建一个简单的表单。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Spring Session + JDBC Demo</title>
</head>
<body><div><form th:action="@{/messages}" method="post"><textarea name="msg" cols="40" rows="4"></textarea><input type="submit" value="Save"/>
</form></div><div><h2>Messages</h2><ul th:each="m : ${messages}"><li th:text="${m}">msg</li></ul></div></body>
</html>

让我们实现一个Controller,以将消息添加到HttpSession并显示它们。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;@Controller
public class MessagesController 
{@GetMapping("/")public String index(Model model, HttpSession session) {List<String> msgs = (List<String>) session.getAttribute("MY_MESSAGES");if(msgs == null) {msgs = new ArrayList<>();}model.addAttribute("messages", msgs);return "index";}@PostMapping("/messages")public String saveMessage(@RequestParam("msg") String msg, HttpServletRequest request) {List<String> msgs = (List<String>) request.getSession().getAttribute("MY_MESSAGES");if(msgs == null) {msgs = new ArrayList<>();request.getSession().setAttribute("MY_MESSAGES", msgs);}msgs.add(msg);return "redirect:/";}
}

现在,您可以启动应用程序并将一些消息添加到HttpSession中,并且可以看到SPRING_SESSIONSPRING_SESSION_ATTRIBUTES表中的行。 默认情况下,Spring Session将我们尝试添加到HttpSession的对象转换为ByteArray并将其存储在表中。

Spring Security的Spring会议

由于SpringBoot的自动配置, Spring SessionSpring Security无缝集成。
让我们将Spring Security添加到我们的应用程序中。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

application.properties中添加默认用户凭据,如下所示:

spring.security.user.name=admin
spring.security.user.password=secret

现在,如果您尝试访问http:// localhost:8080 /,将被重定向到自动生成的登录页面。
登录并查看SPRING_SESSION表中的数据后,您可以看到登录用户名存储在PRINCIPAL_NAME列中。

Spring Session如何工作?

Spring Session提供了HttpServletRequestHttpSession的实现,分别是SessionRepositoryRequestWrapperHttpSessionWrapper 。 Spring Session提供SessionRepositoryFilter来拦截所有请求,并将HttpServletRequest包装在SessionRepositoryRequestWrapper中

SessionRepositoryRequestWrapper.getSession(boolean)中,它被重写以返回HttpSessionWrapper对象,而不是默认的HttpSession服务器实现。 HttpSessionWrapper使用SessionRepository将会话信息保存在数据存储中。

SessionRepository接口具有多种管理会话的方法。

public interface SessionRepository<S extends Session> 
{S createSession();void save(S session);S findById(String id);void deleteById(String id);
}

这个SessionRepository接口由各种类根据我们使用的后端类型实现。 在我们的例子中,我们使用的是spring-session-jdbc提供的JdbcOperationsSessionRepository

结论

正如您可能已经观察到的,由于Spring Boot的自动配置,我们可以通过使用Spring Session进行非常少的配置来有效地管理用户会话。 如果由于某种原因我们想将后端从JDBC更改为Redis或Hazelcast等,那只是简单的配置更改,因为我们不直接依赖于任何Spring Session类。

您可以在https://github.com/sivaprasadreddy/spring-session-samples中找到本文的源代码。

翻译自: https://www.javacodegeeks.com/2018/02/session-management-using-spring-session-jdbc-datastore.html

datastore

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

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

相关文章

关于压缩工具 7z(7-zip) 的选项 -x(排除文件)的解读

文章目录一、选项介绍二、选项语法三、选项示例一、选项介绍 选项 -x 用来指定某一文件或某一类文件从操作中排除&#xff0c;此选项可同时排除多个类型。可以和此选项结合使用的命令&#xff1a;a (添加)&#xff0c; d (删除)&#xff0c; e (释放)&#xff0c; l (列表)&am…

华为服务器芯片总在pc,服务器芯片 华为

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情Linux云服…

python figure函数 gui_python 在一个GUI内创建了2个figure,为什么只能显示第二个图?...

建议你把代码格式化一下&#xff0c;编辑框上有代码块选项&#xff0c;选中代码再点击如下图标就可以格式化。说说这段代码的问题。因为tk我没怎么用过&#xff0c;说明如果有错&#xff0c;帮忙指正。def figure(self):f1Figure((4,3))self.f11f1.add_subplot(111)self.canvas…

java 哈希算法_选择Java密码算法第1部分-哈希

java 哈希算法抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分。 该系列涵盖如何实现以下功能&#xff1a; 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥/私钥非对称加密 第一篇文章详细介绍了如何实现SHA–512哈希。 让我们开始吧。 免责…

在 Linux 下打包命令 tar 和压缩命令 7z 的配合使用示例

文章目录一、压缩命令&#xff08;结合 tar 命令&#xff09;二、解压命令&#xff08;结合 tar 命令&#xff09;一、压缩命令&#xff08;结合 tar 命令&#xff09; tar cf – /home/test | 7z a -si test.tar.7z上面命令将 /home/test 文件夹压缩为 test.tar.7z 文件。实际…

上传书籍进度信息到服务器...,使用HttpWebRequest实现大文件上传资料.pdf

Twilight Software Development Studio © 2011使用HttpWebRequest 实现大文件上传Author:xuzhihongCreate Date:2011-06-03Descriptions: WinForm 程序使用HttpWebRequest 实现大文件上传Url: /blog/static/2673158720115991432899/概述&#xff1a;通常在WinForm 程序中都…

做一个公众号大概要多少钱_公众号流量主一个月可以赚多少钱?

我是小郁儿&#xff0c;点击上方“关注”&#xff0c;每天为你分享自媒体运营与个人精进干货。细心的读者会发现&#xff0c;阅读我文章的时候&#xff0c;最下面不再出现广告卡片了&#xff0c;因为我前几天已经把流量主功能关掉。起初是因为我在看自己发的视频时&#xff0c;…

Linux 命令之 7za -- 文件压缩命令

文章目录一、命令介绍二、7za 和 7z 的区别三、常用选项四、命令示例&#xff08;一&#xff09;压缩指定目录下的内容&#xff08;二&#xff09;解压缩指定的压缩包到指定的目录下一、命令介绍 7za 一种文件压缩命令&#xff0c;7z格式具有高压缩比率&#xff0c;它采用了多…

从Speedment 3.0.17或更高版本的事务轻松返回值

交易次数 在我以前的文章中&#xff0c;我写了关于如何使用Speedment轻松使用事务的方法&#xff0c;其中我们原子地更新了两个银行帐户。 众所周知&#xff0c;事务是一种将多个数据库操作组合到一个原子执行的单个操作中的方法。 但是事务不仅与更新数据库有关&#xff0c;而…

华为路由设置虚拟服务器命令,华为路由器配置ip命令

基本命令  en 进入特权模式conf 进入全局配置模式in s0 进入 serial 0 端口配置ip add xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx 添加ip 地址和掩码&#xff0c;电信分配enca hdlc/ppp 捆绑链路协议 hdlc 或者  ip unn e0  exit 回到全局配置模式in e0 进入以太接口配置ip add x…

分布式锁的三种实现方式_分布式锁的多种实现方式

目前几乎很多大型网站及应用都是分布式部署的&#xff0c;分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区…

apache ignite_使用Apache Ignite优化Spark作业性能(第1部分)

apache ignite来看看他们是如何工作的&#xff01; 本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 。 如果您对这篇文章感兴趣&#xff0c;请查看本书的其余部分&#xff0c;以获取更多有用的信息。 Apache Ignite提供了多种方法来提高Spark作业的性能&#xf…

Linux 命令之 unrar -- 解压 rar 格式的文件

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;按完整路径解压指定的压缩包到当前目录下&#xff08;二&#xff09;按完整路径且不覆盖已存在文件的方式解压指定的压缩档案到指定的目录下一、命令介绍 需要安装 rarlinux 才能使用该命令&#xff0…

微软家庭服务器,微软公布Windows Server 2012版本方案,不再提供家庭服务器版

微软官方网站今日公布Windows Server 2012将有四个版本&#xff0c;分别为Foundation、Essentials、Standard以及Datacenter。其中Foundation只供给原始设备制造商(OEM)&#xff1b;Essentials适合中小企业使用&#xff0c;最大用户数为25个&#xff1b;Standard与Datacenter版…

eclipse创建神经网络_使用Eclipse Deeplearning4j构建简单的神经网络

eclipse创建神经网络神经网络导论 深度学习包含深度神经网络和深度强化学习&#xff0c;它们是机器学习的子集&#xff0c;而机器学习本身就是人工智能的子集。 广义地说&#xff0c;深度神经网络执行机器感知&#xff0c;该机器感知从原始数据中提取重要特征&#xff0c;并对每…

Linux 命令之 rar -- 压缩/解压文件

文章目录一、命令介绍二、子命令三、常用选项四、命令示例&#xff08;一&#xff09;压缩指定文件或者更新压缩包内指定的文件&#xff08;二&#xff09;压缩指定目录下的内容&#xff08;不含目录本身&#xff09;&#xff08;三&#xff09;创建自解压文件&#xff08;四&a…

python 马赛克还原_卷积神经网络教你如何还原被马赛克的文本图像

对人类来说&#xff0c;将带有文字的图像锐化是很容易的。以图1为例。图1&#xff1a;被锐化的图像把图1恢复为图2也不是件很困难的事。图2&#xff1a;原图然而&#xff0c;我们是懒惰的&#xff0c;并且不想这样做&#xff0c;所以我们尝试用神经网络来自动实现图片的不模糊化…

angluar cdk_零分钟即可在容器开发套件(CDK)上实现云运营

angluar cdk尽管这很有趣&#xff0c;但是它实际上并不可行&#xff0c;并且很快就遇到了使用限制。前一段时间&#xff0c; 我逐步完成了在容器中安装称为CloudForms的云管理解决方案。 真正的解决方案是将这个示例放入Red Hat Demo Central集合中&#xff0c;并将其放在基于…

Linux 系统下载和安装 rarlinux

文章目录红帽系的 Linux下载已经编译好的软件包下载程序的源代码软件包Debian Linux安装过程常遇到的问题rarlinux 下载地址&#xff1a;http://www.rarlab.com/download.html rarlinux 相关命令使用说明&#xff0c;猛戳《Linux 系统下命令 unrar 的中文版使用说明》 红帽系的…

腾讯面试编程题python_腾讯面试官出的 2 道经典数据分析面试题

没想到这篇文章这么受欢迎&#xff0c;那就再分享一篇&#xff1a;苏克1900&#xff1a;腾讯高级数据分析师&#xff1a;十年分析之路的力荐书籍​zhuanlan.zhihu.com以下原文章&#xff1a;近期暑期实习和提前批招聘已经开始了&#xff0c;不论你是校招还是想社招&#xff0c;…