使用spring-session外部化Spring-boot应用程序的会话状态

Spring-session是一个非常酷的新项目,旨在提供一种更简单的方法来管理基于Java的Web应用程序中的会话。 我最近在spring-session中探索的功能之一是它支持外部化会话状态的方式,而无需费心诸如Tomcat或Jetty之类的特定Web容器的内部。

为了测试spring-session,我使用了购物车类型的应用程序(可在此处获得 ),该应用程序通过将添加到购物车中的项保留为session属性来大量使用session,如以下屏幕截图所示:


店铺首页

ShopFrontCart

首先考虑没有Spring会话的场景。 所以这就是我公开我的应用程序的方式:

nginxLoadBalanced

我正在使用nginx在该应用程序的两个实例之间实现负载平衡。 使用Spring boot可以很容易地运行此设置,我通过两个不同的服务器端口启动了该应用程序的两个实例:

mvn spring-boot:run -Dserver.port=8080
mvn spring-boot:run -Dserver.port=8082

这是我的nginx.conf,可以在这两个实例之间实现负载平衡:

events {worker_connections  1024;
}
http {upstream sessionApp {server localhost:8080;server localhost:8082;}server {listen 80;location / {proxy_pass http://sessionApp;}       }
}

我在页脚中显示应用程序的端口号只是为了显示哪个实例正在处理请求。

如果我不采取任何措施将会话状态移出应用程序,则该应用程序的行为将不稳定,因为在另一个实例上无法识别在该应用程序的一个实例上建立的会话-特别是如果Tomcat接收到一个会话id,它无法识别,则行为是创建一个新会话。

将Spring会话引入应用程序

有一些特定于容器的方法来引入外部会话存储– 这里是一个示例,其中Redis被配置为Tomcat的存储。 Pivotal Gemfire提供了一个模块来外部化Tomcat的会话状态 。

使用Spring-session的好处是根本不依赖容器-保持会话状态成为应用程序的考虑因素。 在Spring会话站点上,关于配置应用程序以使用Spring会话的说明非常详细,只是为了快速总结一下我如何配置Spring Boot应用程序,这些首先是我引入的依赖项:

<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session</artifactId><version>1.0.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>1.0.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.4.1.RELEASE</version>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.4.1</version>
</dependency>

以及将Spring-session用于会话支持的配置,请注意特定于Spring Boot的FilterRegistrationBean,用于注册会话存储库过滤器 :

mport org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.SessionRepositoryFilter;
import org.springframework.web.filter.DelegatingFilterProxy;import java.util.Arrays;@Configuration
@EnableRedisHttpSession
public class SessionRepositoryConfig {@Bean@Order(value = 0)public FilterRegistrationBean sessionRepositoryFilterRegistration(SessionRepositoryFilter springSessionRepositoryFilter) {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new DelegatingFilterProxy(springSessionRepositoryFilter));filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));return filterRegistrationBean;}@Beanpublic JedisConnectionFactory connectionFactory() {return new JedisConnectionFactory();}
}

就是这样! 现在神奇的是,所有会话都由Spring会话处理,并巧妙地外部化到Redis。

如果我要重试以前的使用nginx使用公共Redis存储对两个不同的Spring-Boot应用程序进行负载平衡的配置,则该应用程序将正常运行,而不管实例处理请求的情况如何。 我期待进一步完善这个出色的新项目。

  • 使用Spring会话的示例应用程序可在此处获得 :https://github.com/bijukunjummen/shopping-cart-cf-app.git

翻译自: https://www.javacodegeeks.com/2014/11/externalizing-session-state-for-a-spring-boot-application-using-spring-session.html

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

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

相关文章

使用纯HTML和OmniFaces构建动态响应的多级菜单

最近&#xff0c;我不得不使用JSF 2.2创建一个响应式多级菜单。 要求&#xff1a;菜单应&#xff1a; 从后端使用动态结构创建 反应灵敏&#xff0c;例如对桌面和移动设备友好 有带有导航链接的子菜单项 支持触摸事件 支持键盘辅助功能 PrimeFaces的菜单不是一个选择。 实…

Membership学习(三)Membership Providers介绍[xgluxv]

本来想在第三篇文章里介绍一下 Membership的类的&#xff0c;不过现在中文msdn也出来了&#xff0c;所以就不写了&#xff0c;&#xff0c;直接到介绍Membership Providers。 Membership Providers提供了Membership数据源和服务之间的所有接口&#xff0c;在Asp.net2.0中…

Servlet技术

----Servlet是用Java语言编写的应用到Web服务器端的扩展技术&#xff0c;它先于jsp产生&#xff0c;可以方便地对Web应用中的HTTP请求进行处理。在Java Web程序开发中&#xff0c;Servlet主要用于处理各种业务逻辑&#xff0c;他比jsp更具有业务逻辑层的意义。 一。Servlet基础…

文件指针创建失败!File *fp失败

问题记录&#xff1a;项目是在所里边的vs2010上创建的&#xff0c;正常&#xff01;在自己的笔记本上使用vs13和19都一直报错&#xff01;指针一直为空&#xff01; 网上查了好久&#xff0c;试了很多方法都没有用&#xff01;最后发现是权限的问题&#xff0c;c盘下边创建不了…

前端开发:小程序--第一步

当我在接到小程序的项目的时候&#xff0c;几乎可以说是一脸懵因为对小程序的概念说实话是不太理解的&#xff0c;或者说理解的不太透彻&#xff0c;但是领导给项目说要完成&#xff0c;那没办法&#xff0c;还是要继续呀。 首先&#xff0c;我就想着先注册一个看看&#xff0…

EasyCriteria已演变为uaiCriteria。 新名称和更多功能

你好&#xff01;你好吗&#xff1f; 我很高兴宣布uaiCriteria的发布&#xff0c;EasyCriteria的演进。 确实需要更改框架名称吗&#xff1f; 是的&#xff0c;可悲的是。 我找到了另一个具有相同名称的框架 &#xff0c;这就是为什么我决定更改名称的原因&#xff08;我不希…

ajax方式下载文件

在web项目中需要下载文件&#xff0c;由于传递的参数比较多&#xff08;通过参数在服务器端动态下载指定文件&#xff09;&#xff0c;所以希望使用post方式传递参数。通常&#xff0c;在web前端需要下载文件&#xff0c;都是通过指定<a>标签的href属性&#xff0c;访问服…

了解Spring Web应用程序体系结构:经典方法

每个开发人员必须了解两件事&#xff1a; 架构设计是必要的。 花哨的体系结构图没有描述应用程序的真实体系结构。 真正的体系结构是从开发人员编写的代码中找到的&#xff0c;如果不设计应用程序的体系结构&#xff0c;最终将得到一个具有多个体系结构的应用程序。 这是否…

springmvc注解小示例(转)

转自&#xff1a;http://www.blogjava.net/pengo/archive/2010/11/28/339229.html 弃用了struts&#xff0c;用spring mvc框架做了几个项目&#xff0c;感觉都不错&#xff0c;而且使用了注解方式&#xff0c;可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mv…

解决maven项目Cannot change version of project facet Dynamic web module to 3.0

1、打开新建的servlet文件例如&#xff08;hibernate.cfg.xml&#xff09;修改头文件为 <?xml version"1.0" encoding"UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" &quo…

爬取w3c课程—Urllib库使用

爬虫原理 浏览器获取网页内容的步骤&#xff1a;浏览器提交请求、下载网页代码、解析成页面&#xff0c;爬虫要做的就是&#xff1a; 模拟浏览器发送请求&#xff1a;通过HTTP库向目标站点发起请求Request&#xff0c;请求可以包含额外的header等信息&#xff0c;等待服务器响应…

关于SSL证书配置、升级的一些问题总结

SSL会成为网站、APP、小程序&#xff08;小程序已经强制使用https&#xff09;等项目的标配。关于SSL证书安装使用的问题今天总结下&#xff0c;以备用。 环境配置&#xff1a;windows server 2008 R2和IIS7.0 1、 安装SSL证书的环境 (温馨提示&#xff1a;安装证书前请先备份…

如何为JBoss Developer Studio 8设置集成和SOA工具

最新的JBoss Developer Studio&#xff08;JBDS&#xff09;的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中&#xff0c;我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进行下一个JBoss集…

WildFly 8的Camel子系统集成了Java EE –入门

就在三天前&#xff0c;围绕Thomas Diesler&#xff08; tdiesler &#xff09;的团队发布了WildFly-Camel子系统的2.0.0.CR1版本&#xff0c;它允许您将Camel Routes添加为WildFly配置的一部分。 路由可以部署为JavaEE应用程序的一部分。 JavaEE组件可以访问Camel Core API和各…

jQuery中国各个省份地图分部代码

jQuery中国各个省份地图分部代码 在线演示本地下载更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

Spring Boot Actuator:自定义端点,其顶部具有MVC层

Spring Boot Actuator端点允许您监视应用程序并与之交互。 Spring Boot包含许多内置端点&#xff0c;您也可以添加自己的端点。 添加自定义端点就像创建一个从org.springframework.boot.actuate.endpoint.AbstractEndpoint扩展的类一样容易。 但是Spring Boot Actuator也提供了…

jQuery自适应倒计时插件

jQuery自适应倒计时插件 在线演示本地下载更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

Unity3D实践系列03,使用Visual Studio编写脚本与调试

在Unity3D中&#xff0c;只有把脚本赋予Scene中的GameObject&#xff0c;脚本才会得以执行。 添加Camera类型的GameObject。 Unity3D默认使用"MonoDevelop"编辑器&#xff0c;这里&#xff0c;我想使用Visual Studio作为编辑器。 依次点击"Edit","Pre…

纯CSS3文字Loading动画特效

纯CSS3文字Loading动画特效是一款个性的loading文字加载动画。 在线演示本地下载更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

如何为JBoss Developer Studio 8设置BPM和规则工具

最新的JBoss Developer Studio&#xff08;JBDS&#xff09;的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中&#xff0c;我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进行下一个JBoss集…