• Windows 环境下分布式跨域Session共享(转)


    出处:http://www.cnblogs.com/stangray/p/3328092.html

    为什么还是那句话,在网上找了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_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters 

    将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上有说明的.

  • 相关阅读:
    web service 项目 和 普通 web项目 的 区别
    1) Apache Maven 's README.txt
    spring + rs + RocketMQ 【精】
    wadl 的自动生成(cxf版本3.1.1)
    新建maven web 项目后,出现的小问题
    cxf-rs client 调用
    wadl 的自动生成(cxf版本2.7.6)
    Java学习路线
    Tomcat 学习记录
    Spring Boot 学习记录
  • 原文地址:https://www.cnblogs.com/smileberry/p/6529097.html
Copyright © 2020-2023  润新知