SqlServer Session共享注意点

公司下派任务,之前的网站是一台服务器,由于用户过多,负载过大,现在老大要求多加一台服务器。加就加贝,应该跟我这DEV没有

关系吧,应该不会碰到Source的吧。但是,之前网站有一些数据是放在Session里面的。大家应该理解Sessino的机制(自己的理解):当用户访问服务器的时候,会在Cookie里面留下一个SessionId,HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value就能取到,然后服务器会根据这个SessionId 来跟我服务器这边进行数据匹配,简单说就是拿你的SessionId来取存放在我服务器端的数据,类似于Key:Word。由于当一个客户端访问一个服务器,存放在Session的数据是在服务器端的,若是我加一台服务器的话,这Session的数据就要共享出来,能够让我两台机器同时访问到。这样,用户访问服务器的时候,我切换服务器机器就不会丢失Sesson里面的数据了。

  我遇到的问题:

  在网上搜了关于Session 共享的方法,http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html  有很多,我就选择一个SqlServer共享Sessin的方法。

  首先,你得建立这个Sqlserver数据库。cmd命令。C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S jpmsnmdb05t - E -d AWBUISession -ssadd -sstype c

  命令不懂的看我文中的链接。很简单。

  然后,在Asp.net 项目中的Web.config里面<system.web>输入

<machineKeyvalidationKey="1234567890123456789012345678901234567890AAAAAAAAAA"decryptionKey="123456789012345678901234567890123456789012345678"validation="SHA1"decryption="Auto"/>
<sessionStatemode="SQLServer"sqlConnectionString="server=jpmsnmdb05t; database=AWBUISession;Trusted_Connection=Yes; Persist Security Info=False;"allowCustomSqlDatabase="true"cookieless="false"timeout="100"/>

  到了这一步你在代码里面设置Session["name"]="value"的话,他就会将你的信息保存在SqlServer你建立的数据库中Session表中。

读取的话,我是这样设置的,从客户端获得SessionId,然后根据这个SessionId到表里面查询,查到的数据反编译出来就可以了,不懂得可以看看我的附件,我写了一个用户登录测试系统。

  当中我遇到了一个问题,就是我不会建立测试环境。光有两台机器。你要记住,SessionId是cookie信息,那么不同的domain(就是URL)他的SessionId是不同的,所以你要建立多个服务器共享一个session的话,一定要建立一个相同的domain。这样你就可以随心所欲访问那一台服务器了,举个例子:比如用户登录时访问了第一台服务器,登录好后,服务器切换到第二台服务器了,用户当然不知道,用户还在继续访问页面,系统肯定要检测一下是不是用户登录了,不然得让用户登录去,好,你得看看Session里面的信息吧,根据SessionId得到信息?若是domain不同,你的SessionId不同,现在你的SessionId已经不是之前的那个了,你肯定在怀恋你登录第一台服务器的SessionId。若是你设置同一个domain的话,好,你无论访问多少台机器,你的SessionId是一个,那么取出用户信息还不是小case。好,如何建立一个相同的domian:

  设置本地的host,本地host路径在哪?我问同事的,我也不是很清楚了,C:\Windows\System32\drivers\etc

  很简单,你知道你的服务器IP地址吧。那么只要修改你的host文件,看

    172.23.126.137      SessionTest          # source server
      10.168.109.120      SessionTest         # x client host

  这是我添加的,两台服务器,同一个domain:SessionTest

    由于我把系统发布到服务器IIS的时候设置的端口号是8078,所以我只要在本地访问http://sessiontest:8078/就好了。

   手动的开/关IIS里面的站点进行切换服务器。

   这样测试的环境也弄好啦。

    有个没有解决的问题,若是有读者涉及到也可以交流一下,在本地运行我的VS,访问页面,没有任何的问题,

若是把系统放到服务器上面,我发现,当我取Session信息的时候,存放Session数据库表中满足我页面搜索条件的只有一条,但是它却出现了两条,这两条SessionId,前一大半是一样的,跟HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value 是一样的。HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value这个值,居然跟我ASPStateTempSessions表里面的SessionId不一样。我的HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value只是ASPStateTempSessions表里面的SessionId的一半。看下图,

HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value :x0if3uuddqmpl4451jberf2h

ASPStateTempSessions表里面的SessionId:x0if3uuddqmpl4451jberf2h077b2520

时间: 2024-12-15 07:10:17

SqlServer Session共享注意点的相关文章

Session共享的解决方案

http://www.cnblogs.com/xinhaijulan/archive/2010/08/21/1805116.html 1.客户端SessionID值唯一: 对于不同的域名:主域名.子域名.跨站点域名或跨服务器域名,用户在打开页面时会产生不同的SessionID, 为了使这些站点在用户登录时只登录一次,那我们就要解决SessionID的问题,必须使SessionID在这些共享Session的站点中只产生一次.而SessionID是存储在客户端的cookie之中键值为ASP.NET_

分布式中使用Redis实现Session共享(二)

上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+iis实现负载均衡搭建负载均衡站点了,这里我们会搭建两个站点来验证redis实现的session是否能共享. 阅读目录 Session实现原理 session共享实现方案 问题拓展 总结 回到顶部 Session实现原理 session和cookie是我们做web开发中常用到的两个对象,它们之间会不会

nginx+redis实现session共享 .NET分布式架构

上两篇文件介绍了如何安装和封装redis 本篇主要是记录下怎么实现 nginx+redis实现session共享 目前session问题点 又爱又恨的Session 刚接触程序开发的人一定爱死Session了,因为Session让Http从无状态变成有状态了,页面之间传值.用户相关信息.一些不变的数据.甚至于查出来的DataTable也可以放进去,取值的时候只需要Session[Key]即可,真是方便极了.Session真是个利器,人挡杀人佛挡杀佛,但任何事物被封为利器基本也是双刃剑,Sessi

Nginx做负载均衡时session共享问题详解

用nginx做负载均衡时,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 再者Nginx连接Memcached集群时,Nignx的请求从memcached服务器中根据key获得了value则直接返回value,如果没有获得到value则去MySQL中查询再返回. location / { set $memcached_key "$request_uri"; #设置请求memcached服务器的key memca

Redis主从复制实现session共享

一.Redis安装 1. 下载安装扩展源及源码包 yum install -y epel-release jemalloc-devel wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21 tar -zxvf 2.8.21 make:make PREFIX=/usr/local/redis install mkdir -p /usr/local/redis/etc 解决办法: cd deps/ make hiredis lua

Nginx-tomcat-redis------负载均衡以及session共享

测试环境 Nginx 1.10.1 tomcat 7.0.70 Redis-x64-3.2.100 说明 tomcat 8 和 redis 实现session共享 有问题. 寻找源码 发现tomcat8 中的 catalina.jar 已经没有了 org.apache.catalina.util.LifecycleSupport 这个类. 然而这个类在redis的启动中需要加载,所以就一直报错 java.lang.NoClassDefFoundError: org/apache/catalina

spring boot + redis 实现session共享

这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: @Configuration @EnableRedisHttpSession public class RedisSessionConfig { } 而@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,所以

Tomcat集群环境下session共享方案梳理(1)-通过memcached(MSM)方法实现

对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式: 一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据: 另一种就是在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据. Tomcat集群session同步方案有以下几种方式: 1)使用tomcat自带的

Ubuntu上使用Redis数据库存储SessionID并实现Session共享

p { margin-bottom: 0.1in; direction: ltr; color: #00000a; line-height: 120%; text-align: left; orphans: 2; widows: 2 } p.western { font-family: "Liberation Serif", serif; font-size: 12pt } p.cjk { font-family: "Noto Sans CJK SC Regular"