分布式之Session共享

Redis实现分布式session功能的共享 最近项目设计集群,实现了一下session的共享功能,其原理是将session保存到分布式缓存数据库中如:redis, memcache等,然后多个服务器tomcat 每次请求都通过NoSql数据库查询,如果存在,则获取值;反之存放值。 我是通过redis来实现session的共享,其主要有一下两种方法: 1、通过tomcat服务器的拓展功能实现 这种方式比较简单,主要是通过继承sessio 阅读详情

在上一篇博文中我们通过Nginx+IIS实现了一个简单的负载均衡,那么随之而来的问题就是多个站点在切换时如何共享Session信息,本篇介绍在.net中通过Redis实现分布式站点的Session共享,并且无需修改原项目的Session读取方式。

ASP.Net session存储方式

首先我们看下asp.net中session能采用的存储方式及优缺点。如下:

  1. InProc模式(进程内模式) ,为默认设置。优点是性能高无需跨进程读取,缺点是依赖asp.net进程,当进程崩溃重启时会丢失,并且在分布式的情况下无法多个站点共享。
  2. StateServer模式(状态服务器模式)。会话状态存储在一个名为ASP.Net状态服务的单独进程中,这确保了在重新启动Web应用程序时会保留会话状态,并让会话状态可用于网络中的多个Web服务器。
  3. SQL Server模式。会话状态存储到一个SQL Server数据库中。这确保了在重新启动Web应用程序时会保留会话状态,并让会话状态可用于网络中的多个Web服务器。
  4. Custom模式。此模式允许您指定自定义存储提供程序,例如分布式中常采用自定义模式将站点Session存储在Redis或Memcached中。
    本篇即采用Custom模式自定义存储提供程序将Session存储在Redis中。

Redis存储Session

采用Custom模块需要修改web.config配置文件中网站的sessionState节点的mode属性为Custom,另外我们需要写一个类实现SessionStateStoreProviderBase抽象类,通过实现抽象类的方法可以对Session自定义增删查改,目前微软已经有Redis存储的实现版本了,直接nuget安装RedisSessionStateProvider包即可,如下:
RedisSessionStateProvider
asp.net session共享
sessionState中将redis配置改为Redis服务器连接配置,然后我们新建一个mvc视图来测试多个站点下的Session读取和共享。Controler代码如下:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            if (this.HttpContext.Session["MySessionTest"] == null)
            {
                this.HttpContext.Session["MySessionTest"] = string.Format("站点{0}创建的Session", Request.ServerVariables.Get("Server_Port").ToString());
            }
            return View();
        }
    
        public JsonResult GetSession()
        {
            var result = this.HttpContext.Session["MySessionTest"].ToString();
            return Json(new { isok = true, result = result }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
       
    }

在index action中我们写入了一个key=MySessionTest的session信息,并且将站点端口信息写入到了值中,然后提供了一个接口方法用来读取并返回session[“MySession”]。然后我们看下视图页面代码:

<div class="jumbotron">
    <h1>ASP.NET</h1>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <h3>
        服务器地址:@Request.ServerVariables.Get("Server_Name").ToString()
    </h3>
    <h3>
        服务器端口:@Request.ServerVariables.Get("Server_Port").ToString()
    </h3>
    <div>
        <input id="sessiontxt" /> <button onclick="GetSession()">读取Session["MySessionTest"]</button>
    </div>
</div>
    function GetSession() {
        $.ajax({
            type: "GET",
            url: "/Home/GetSession",
            xhrFields: { withCredentials: true },
            success: function (data) {
                if (data.isok == true) {
                    $("#sessiontxt").val(data.result);
                }
            }
        });

    }

功能很简单,显示当前站点的地址及端口信息,点击按钮会调用接口读取session信息并输出到文本框中。现在我们做一个测试,我们在IIS上新建三个站点8010/8020/8030都指向这个网站,然后我们分别访问三个网站查看session获取结果如下:
负载均衡下的Session共享
Redis共享SessIon
可以看到我们先访问的8010网站,session在进入8010网站的时候创建了session,在访问8020网站点击按钮获取session时获取到的session和8010是相同的,至此我们已经实现了多个站点的Session共享。配合我在上一篇博文中讲的负载均衡就实现了分布式系统各个web站点之间的session共享了。

上一篇:Nginx+IIS实现负载均衡

分布式Session共享和单点登录实现 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码 阅读详情

相关推荐

【SpringBoot】18、SpringBoot中使用Session共享实现分布式部署

前言:我们知道,在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作 但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式 一、创建项目 创建 SpringBoot 项目,选择 Maven 依赖 最终 pom.xml 文件如下: <!-- redis的依赖 --&g

JACKAL 21万+

关于自定义SessionState存储之SessionStateStoreProviderBase类

SessionStateStoreProviderBase类 为session-state数据存储的提供者定义需要成员. [AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingP...

weixin_34127717的博客 856

内网(极空间)搭建gitlab跳板机转发端口及域名配置

然后,回头尝试用内网地址+15022 clone,成功,用公网的ip+15222 clone失败,那就是定位到时nginx转发的问题了。首先想到的就是 git clone是通过ssh的22端口进行下载的,那就需要打通22端口,则又配置22端口的nginx转发。然后,我通过ssh命令,做一个端口转发,以实现内网穿透,将服务端口链接到跳板机上。然后穿透到阿里云服务器跳板机的端口,只能内网访问,需要用nginx做个转发,才能用公网ip进行访问。然后,如上,我的80端口,映射15080,22端口映射15022。

God丶Davide的博客 6076

你的项目真的需要Session吗?redis保存session性能怎么样?

在web开发中,Session这个东西一直都很重要,至少伴随我10年之久, 前一段时间发生一个性能问题,因为redis session 问题,后来想想 其实我的项目session 是不需要的。 先看看 test 的code吧: public class HomeController : Controller { public ActionResult Index()

dz45693的专栏 1万+

异次元发卡最新漏洞0day(XSS组合拳)

异次元商店头像上传处存在存储型XSS注入(user、admin均存在)。其中,user处有过滤,admin无。 将恶意脚本插入后,管理员访问用户管理页面即可执行恶意脚本。 恶意脚本执行后,会新增一个管理员用户,进而获得权限。鉴于漏洞还没有泛滥,而且很多站都有漏洞。EXP暂时不公开。需要学习可以加入知识星球

白昼小丑的博客 4596

DC/DC恒压输出控制原理与应用

DC/DC恒压输出控制

propor的专栏 4281

ASP.NET多站点Session共享

首先,这些站点的Session必须存在sqlserver中。 站点A和站点B的 web.config加入下面代码。 <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A1046...

weixin_30361641的博客 272

基于 Arduino 的鱼缸水质检测控制系统设计

本系统通过多传感器实时采集鱼缸水质参数(pH 值、温度、溶解氧、浊度),经 Arduino 主控芯片处理后,驱动执行模块自动调节水质,并通过显示模块实时展示数据。系统具备阈值报警、自动换水、温度调节、增氧等功能,适用于家庭或小型水族箱的水质智能管理。本设计提供了低成本、易扩展的鱼缸水质管理方案,适用于家庭水族箱或小型水产养殖场景,可根据实际需求调整传感器类型和控制逻辑。注:本设计如有疑问需要解惑可直接私信本人,看我个人简介。

weixin_42300449的博客 1087

session共享学习

session

ldq18的博客 2754

计算机网络基础:揭开网络世界的神秘面纱

计算机网络基础:揭开网络世界的神秘面纱,计算机网络已深度融入现代生活,这篇文章对其基础内容展开全面阐述。开篇介绍计算机网络的定义,说明其由计算机设备、网络设备和传输介质构成。接着从地域范围和拓扑结构两个维度对计算机网络进行分类,并详细讲解 OSI 和 TCP/IP 参考模型,明晰各层功能与联系。随后阐述网络通信协议的定义及常见协议,如 TCP/IP、HTTP 等。最后聚焦网络安全,涵盖定义、重要性以及防火墙、加密技术等常用安全技术。文章旨在帮助读者构建计算机网络基础知识体系,理解其在生活和工作中的应用与价值

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

STM32F103RCT6的FLASH读写操作

STM32F103RCT6是一款常用的32位微控制器,它具有内置的FLASH存储器,可以用于存储程序代码和数据。在本文中,我们将详细介绍如何进行STM32F103RCT6的FLASH读写操作,并提供相应的源代码。写入数据时,我们通过将数据直接写入FLASH地址来完成。通过使用适当的API和规则,我们可以有效地读取和写入数据。写入FLASH时,我们需要按特定的规则进行编程。首先,我们需要包含适当的头文件和定义相关的宏和变量,以便在代码中使用FLASH API。类型的指针,我们可以直接读取FLASH中的数据。

UplKubernetes的博客 1034

如何实现session共享的几种解决方案?

先了解一下为什么会出现这种session共享的解决方案? 随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题 当用户进行一个session会话的时候,比如一个用户去登录项目,一般的大公司的项目都是有Nginx进行反向代理的,但是这里简单列举一下Nginx常用的几种反向代理策略:1.轮询策略,2. 权重比例策略,3. ...

王伟的博客 1万+

点云结构面智能识别与裂隙网络分析系统

点云结构面智能识别系统摘要 本系统采用深度学习与传统几何算法融合的方法,实现岩石结构面的智能识别与分析。系统包含7个核心模块:点云预处理、结构面识别、分组分割、参数计算、粗糙度分析、裂隙网络生成和可视化。技术路线结合PointNet++深度学习架构与RANSAC、区域生长等传统算法,通过预处理→深度学习识别→几何精修→参数计算→网络构建的流程实现高精度分析。预处理模块实现点云降噪、下采样和法向量估计,深度学习模块基于改进的PointNet++架构进行特征提取和分类。系统支持多种点云格式输入,提供完整的结构面

huanghm88的专栏 346

分布式环境下,如何实现 session 共享(How to Implement Session Sharing in a Distributed Environment)

Session是一种用于维护客户端与服务器之间会话的技术。‌ 它主要用于存储特定用户会话中的信息,确保在用户与服务器交互的过程中,数据不会丢失‌。当用户通过浏览器访问网站时,服务器会为该用户创建一个唯一的Session对象。这个Session对象存储在服务器端,并通过一个唯一的标识符(通常是中的Cookield)与客户端进行关联。用户在进行页面跳转或发起新的请求时,服务器可以通过sessionId识别用户,从而恢复之前的会话状态‌。本章详细介绍分布式环境下,如何实现 session 共享。

Linux运维老纪的博客 2050

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 287

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

redis实现分布式session共享

为什么要共享session? 我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可,session即可存储在Tomcat上。 但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果Tomcat-A已经为客...

草莓甜甜圈的博客 7963

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring Session + Redis实现分布式Session共享

通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?实际上实现Sessi

叉叉哥的BLOG 7万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

session共享怎么做的(分布式如何实现session共享)?

session共享怎么做的(分布式如何实现session共享)? 问题描述:一个用户在登录成功以后会把用户信息存储在session当中,这时session所在服务器为server1,那 么用户在 session 失效之前如果再次使用 app,那么可能会被路由到 server2,这时问题来了,server 没有该用户的 session,所以需要用户重新登录,这时的用户体验会非常不好,所以我们想如何...

学亮编程手记 2327

分布式环境下Session共享问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、nginx的ip_hash策略二、Tomcat Session复制(不推荐)三、Session共享(推荐)1.简介2.Spring Session 前言 由于HTTP协议是无状态的,客户端和服务器的会话产生的数据不会被保留,所以第二次请求时服务器就无法识别你之前访问过,因为早期都是静态页面,可以无状态,后来动态内容多起来,就需要有状态来区分客户端的访问,然后就出现了Cookie和Session。 分布式环境下,客户端两次请

u012387539的博客 251

分布式Session共享解决方案

Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session共享会出现请求落到不同机器要重复登录的情况,一般来说解决Session共享有以下几种方案。 1、session复制 session复制是早期的企业级的使用比较多的一种服务器集群session管理机制。应用服务器开启web容器的sessi...

红豆和绿豆的博客 1万+

分布式session共享

一、前言 为什么会出现session共享问题? 客户端与服务器交互时会产生唯一的sessionid用于标记用户,但是在分布式架构中,如果还是采用 session 的方式,用户发起请求,通过 nginx 做请求转发时,并不知道是转发到服务器1还是服务器2,所以就会出现session共享问题。 关于分布式 session 共享有两种解决方式,使用 spring-session ...

weixin_30673715的博客 206

分布式session共享配置

分布式session共享配置

棉花糖老丫 1476

手把手教你用SpringBoot+Redis实现分布式Session共享

在分布式系统架构中,传统的单节点应用的 Session 管理方式已无法满足需求。当用户请求在多个服务节点之间流转时,需要保证用户的 Session 信息能够在各个节点间共享,否则会出现用户重复登录等问题。Redis 作为高性能的内存数据库,具有快速读写和持久化等特性,非常适合用于存储分布式环境下的 Session 信息。本文将详细介绍如何使用 Spring Boot 和 Redis 实现分布式 Session 共享。

梵心白莲的博客 819

分布式中session共享的解决方案:spring-session

Session是客户端与服务器通讯会话跟踪技术,是服务器与客户端保持整个通讯的会话基本信息。客户端在第一次访问服务器的时候,服务端会响应一个sessionId并且将它存入到本地的Cookie中,在之后的访问会将Cookie中的sessionId放入到请求头中去访问服务器,如果通过这个sessionId没有找到对应的数据,那么服务器就会创建一个新的sessioinId并且响应给客户端。分布...

weixin_30289831的博客 185

JavaWeb 之分布式Session共享

Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了! https://blog.csdn.net/vbirdbest/article/details/89204972 https://www.cnblogs.com/wf1647790534/p/9802538.html

const_ 711
上一篇: 基于Quartz搭建的可扩展Windows定时服务框架
下一篇: C#优雅使用null运算符
Leaderxin
博客等级 码龄9年 22粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值