Windows 环境下分布式跨域Session共享
为什么还是那句话,在网上找了N篇Session共享,但真正可以直接解决问题的还是没有找到。
一、以下为本人亲测,为防止环境不一致,对本文产生歧义,限定环境如下:
1. IIS7.0
2. Asp.net 的站点
3. StateServer模式,数据库及自定义配置不在本文讨论范围。
4. 192.168.1.41 (主站点服务器,域名:www.xxx.com) ,192.168.1.43 (业务分发服务器 域名:BDN1.xxx.com)
5. 实现的跨域也只是跨子域的方法。(因为最终都是读取根域下的Cookie来读取SessonID共享的)
二、配置
主站点服务器web.config
1. <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>
将模式改为 StateServer ,默认是关闭远程访问,需要打开注册表(regedit),HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters
将AllowRemoteConnection 改为 1 可以使用Telnet 192.168.1.41 42424 测试一下是否已经打开。
2. <httpCookies domain="xxx.com" />
将Cookie的Domain限定要根域名下,以使下一级的子域都可以访问到这个Cookie.
另外提一下,如果你只是想让Session在根域下,其他的Cookie另外设置,可以使用这样的方法.
<sessionState sessionIDManagerType ="B2BSite.MySessionIDManager" mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>
public class MySessionIDManager : SessionIDManager, ISessionIDManager
{
void ISessionIDManager.SaveSessionID(HttpContext context, string id, out bool redirected, out bool cookieAdded)
{
base.SaveSessionID(context, id, out redirected, out cookieAdded); if (cookieAdded)
{
var name = "ASP.NET_SessionId";
var cookie = context.Response.Cookies[name];
cookie.Domain = "xxx.com";
cookie.Path = "/";
}
}
}
3. <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
不同的机器会产生不一致的Session,所以需要指定MachineKey,来使不同的机器产生的Session可以相互读取.
业务分发服务器web.config
1. <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>
tcpip=为主服务器的StateServerIP.你也可以独立出来.我这边是放在主服务器上了.
2. <httpCookies domain="xxx.com" />
3. <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
这个machinekey必须与主站点服务器的machinekey 一样.
注:最后也是最关键的一点.很多文件都没有提到,就是IIS 设置中站点的ID,两个网站必须一样,如果主站点服务器的站点ID是3,那么业务分发服务器的站点ID也必须是3.要不然就不可以访问.我在这个地方卡了很久.MSDN上有说明的.
最新文章
- sscanf()函数的使用及其实例
- M1卡介绍
- android系统平台显示驱动开发简要:LCD基本原理篇『一』
- java继承分析
- Python学习入门基础教程(learning Python)--3.3.1 Python下的布尔表达式
- getuid和geteuid的区别
- OSS项目进度(2.19)
- Objective-C方法与函数的区别
- Phpstorm-远程连接服务器实时编辑代码
- mysql [assword expired
- jvm回收器回收过程一:CMS和 G1的初认知(持续更新中)
- 使用fabric2打包部署文件
- SQLServer转PowerDesigner(转载)
- .NetCore中EFCore的使用整理(二)-关联表查询
- Codeforces 801C - Voltage Keepsake
- consensus sequence
- GetImageURL
- 原型相关的方法isPrototypeOf、Object.getPrototypeOf、hasOwnProperty、Object.getOwnPropertyName、Object.keys
- 基于Python的信用评分卡模型分析(二)
- Rest-Framework组件源码之认证、频率、权限
热门文章
- 【二分】【半平面交】Gym - 101309J - Jungle Outpost
- Problem I: 零起点学算法88——青年歌手大奖赛_评委会打分
- Codeforces Round #343 (Div. 2) B. Far Relative’s Problem 暴力
- 2015 百度之星 1003 棋盘占领 dfs
- 怎么提高DB的效率
- Inno Setup入门(十六)——Inno Setup类参考(2)
- AS3.0 效率优化
- 在matlab中clear,clc,clf,hold作用介绍
- 8.8.8.8和8.8.4.4 DNS域名解析服务器
- 关于TagHelper的那些事情——如何自定义TagHelper(TagHelper基类)