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

相关文章

windows2008 sp2 x64安装 ocs 2007 r2 笔记

在写这篇日志之前&#xff0c;反反复复安装了N次&#xff0c;重装操作系统好几次&#xff0c;为了让大家不再犯同样的错误&#xff0c;特留下几点要注意的&#xff1a; 1. 不要用windows2008 r2 装 ocs 2007 r2&#xff0c; 我很天真的下载了windows2008 r2 并开始装 ocs r2&am…

JS(JQEERY) 获取JSON对象中的KEY VALUE

var json { "Type": "Coding", "Height":100 };for (var key in json){alert(key); alert(json[key]);}$.each(json, function(i) {alert(json[i]);alert(i); }); 转载于:https://www.cnblogs.com/ytjjyy/archive/2012/04/17/2453340.html

vue 特定条件下绑定事件

今天写了个小功能&#xff0c;看起来挺简单&#xff0c;写的过程中发现了些坑。1.div没有disabled的属性&#xff0c;所以得写成button2.disabled在data时&#xff0c;默认是true&#xff0c;使得初始化时&#xff0c;默认置灰按钮&#xff0c;无法点击 <div classform-item…

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

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

Jquery 日历控件

非常好的Jquery日历控件 http://keith-wood.name/datepick.html 转载于:https://www.cnblogs.com/hubj/archive/2011/04/28/2031791.html

poj 3041

题目链接&#xff1a;http://poj.org/problem?id3041 没看题&#xff0c;网上搜最大二分匹配搜到的 匈牙利算法&#xff0c;深搜一次最多增加一个匹配 代码&#xff1a; #include <stdio.h> #include <stdlib.h> int tu[505][505]; int mx[505],my[505]; int flag…

使用JAX-RS(Jersey)的HTTP状态错误消息响应中的自定义原因短语

在最近的一些工作中&#xff0c;我收到了在发生错误时在HTTP状态响应中生成自定义“原因短语”的请求&#xff0c;该状态短语传递给我们的一个REST API消耗客户端。 在这篇文章中&#xff0c;我将演示如何使用Jersey来实现。 1.定义检查的异常和异常映射器 正如您可能从我的文…

hdu 1251 统计难题(求前缀出现了多少次)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1251 #include <iostream> #include <cstring> #include <cstdio> #define mem(a,b) memset(a,b,sizeof(a)); using namespace std; typedef long long ll; const int maxn 500005; const l…

新浪微博后台服务器架构

http://www.slideshare.net/iso1600/high-performance-weibo-qcon-beijing-2011-7577912High Performance Weibo QCon Beijing 2011 View more presentations from Tim Y 转载于:https://www.cnblogs.com/inteliot/archive/2012/04/19/2457008.html

如何将商业第三方文物整合到您的Maven版本中

根据ZeroTurnaround的RebelLabs最近进行的一项调查 &#xff0c;Maven仍然是领先的Java构建平台。 根据RebelLabs&#xff0c;当前的市场份额分布是&#xff1a; Maven的64&#xff05; 蚂蚁常春藤与16.5&#xff05; 摇篮与11&#xff05; 但是&#xff0c;与此同时&#…

2012年4月18日 新的开始

博客原本写在 http://50.17.193.116/但是由于没有域名的关系,不能被大多的搜索引擎给搜索到,为了能更大的分享我个人的一部分学习经验,将我的blog同时在博客园同步更新. 今天将开始书写自己的Blog&#xff0c;感谢师太提供了50.17.193.116这样一个还行&#xff0c;能将就用用的…

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

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

为什么要保持软件包依赖项自由循环的五个原因

如果您很不幸不能在一个项目中与我一起工作&#xff0c;那么您将遭受所有软件包依赖项必须无循环的规则的困扰。 我不仅需要这样做 &#xff0c;而且还将创建一个单元测试&#xff0c;以确保使用Degraph进行测试。 这就是我认为无周期封装结构对项目有益的原因。 有用的抽象 &…

Servlet技术

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

Mysql远程登录及常用命令

第一招&#xff1a;mysql服务的启动和停止 启动&#xff1a;net start mysql 停止&#xff1a;net stop mysql 第二招&#xff1a;登陆mysql 语法如下&#xff1a;mysql -u用户名 -p用密码 键入命令mysql -uroot -p&#xff0c;回车后提示你输入密码&#xff0c;输入12345&…

基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID

我最近参与了一个项目&#xff0c;我们需要捕获Websocket请求的http会话ID –原因是要确定使用相同基础HTTP会话的Websocket会话的数量。 这样做的方法基于利用新的spring-session模块的示例&#xff0c;并在此处进行描述。 捕获http会话ID的技巧是理解在浏览器和服务器之间建…

用过的jQuery记录

var list $(input:radio[name"name"]:checked).val();  //选择input中单选name为“name”的并且是选中状态的 index $(document).data(index);  //把参数存入document中保存起来并在下一次中取出再用index 1index $(document).data(index); str.find("input…

windows phone画板程序

前几天想要这样一个程序&#xff0c;没找到&#xff0c;今天上网偶然发现了&#xff0c;转载过来。 <Grid> <InkPresenter x:Name"MyPresenter" HorizontalAlignment"Left" VerticalAlignment"Top" MouseLeftButtonDown"MyP…

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

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

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

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