zoukankan      html  css  js  c++  java
  • 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_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上有说明的.

  • 相关阅读:
    Appium+python自动化17-启动iOS模拟器APP源码案例
    Pycharm上python和unittest两种姿势傻傻分不清楚
    jenkins显示html样式问题的几种解决方案总结
    Appium+python自动化16-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器
    selenium+python在mac环境上的搭建
    python+requests接口自动化完整项目设计源码
    Appium+python自动化15-在Mac上环境搭建
    git使用教程2-更新github上代码
    git使用教程1-本地代码上传到github
    针对初学者的A*算法入门详解(附带Java源码)
  • 原文地址:https://www.cnblogs.com/stangray/p/3328092.html
Copyright © 2011-2022 走看看