Session共享主要保证两点:

  1. 前台Asp_SessionId的Cookie作用域为顶级域名,且值相同
  2. 后端Session公用同一源 通过自定义HttpModule可以实现这两个需求
    /// <summary>
/// 自定义HttpModule,使调用本HttpModule的系统使用同一个SessionID(只限于同一个根域名),实现Session共享
/// 需要在AppSetting里面配置Domain(根域名),在system.webServer下添加自定义modules add name = "MakeSessionIDOneOnly" type="Tools.MakeSessionIDOneOnly, Tools"
/// </summary>
public class MakeSessionIDOneOnly : IHttpModule
{
private string m_RootDomain = string.Empty; #region IHttpModule Members public void Dispose()
{ } /// <summary>
/// Init函数主要让本系统对应的StateServer中的Session的s_uribase(可以理解为作用域)一致,统一设置为根域名,这样相当于多套系统统一使用一个Session库
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
//1.获取根域名
m_RootDomain = ConfigurationManager.AppSettings["Domain"];
//2.获取System.Web.SessionState.OutOfProcSessionStateStore类
Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore");
//3.获取该类的静态字段s_uribase
FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); if (uriField == null)
throw new ArgumentException("UriField was not found");
//object obj= uriField.GetValue(null); //4.设置s_uribase值为根域名
uriField.SetValue(null, m_RootDomain);
context.EndRequest += new System.EventHandler(context_EndRequest);
} /// <summary>
/// 上下文结束时让输出的cookie作用域一致,统一设置为根域名
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void context_EndRequest(object sender, System.EventArgs e)
{
HttpApplication app = sender as HttpApplication;
for (int i = 0; i < app.Context.Response.Cookies.Count; i++)
{
if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
{
app.Context.Response.Cookies[i].Domain = m_RootDomain;
}
}
} #endregion
}

Init方法可以实现所有使用本HttpModule的项目使用同一个源的Session,这样在输出ASP.NET_SessionId的cookie时就会是相同的值,但是Cookie作用域没办法修改。 在context_EndRquest方法中重新设定ASP.NET_SessionId的作用域为根域名即可。 在需要调用本Module的项目Web.Config中需要加入

  <system.web>
<compilation debug="true" targetFramework="4.6.1"/>
<httpRuntime targetFramework="4.6.1"/>
<!--设定session状态服务器的存储位置,共享session的项目都要设置为同一位置-->
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30"></sessionState>
<!--设置session的加解密方法,共享session的项目必须设置相同-->
<machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
<!--IIS6或者IIS7经典模式,引用session统一处理模块-->
<httpModules>
<add name="MakeSessionIDOneOnly" type="Tools.MakeSessionIDOneOnly,Tools"/>
</httpModules>
</system.web>
<system.webServer>
<modules>
<!--IIS7集成模式,引用session统一处理模块-->
<add name="MakeSessionIDOneOnly" type="Tools.MakeSessionIDOneOnly,Tools"/>
</modules>
</system.webServer>
<appSettings>
<!--要共享Session的项目必须设置同一根域名-->
<add key="DOMAIN" value="localhost"/>
</appSettings>

同一域名的ASP.NET网站实现Session共享的更多相关文章

  1. asp.net 分布式探讨之Session共享问题

    ---恢复内容开始--- Session共享是分布式架构设计中的一大难点,尽管session共享的解决方案不少,但是.net 下的解决方案还是比较少,而且说明文档也很少. 之前尝试用memcached ...

  2. ASP.NET MVC 使用Redis共享Session

    储存模式 1.InProc模式 这是ASP.NET默认的Session管理模式,在应用进程内维护Session. 2.StateServer模式 这是在服务器装了.NET环境后自带的一个StateSe ...

  3. ASP.NET应用程序和ASP.NET网站所共有的文件: App_Browsers 等

    App_Browsers  包含 ASP.NET 用于标识个别浏览器并确定其功能的浏览器定义 (.browser) 文件.有关更多信息,请参见浏览器定义文件架构(browsers 元素)和如何:在 A ...

  4. SqlServer Session共享注意点

    公司下派任务,之前的网站是一台服务器,由于用户过多,负载过大,现在老大要求多加一台服务器.加就加贝,应该跟我这DEV没有 关系吧,应该不会碰到Source的吧.但是,之前网站有一些数据是放在Sessi ...

  5. memcache相同主域名下的session共享

    本配置适合具有相同主域名的多台服务器进行session共享. 例如:www.lee.com , bbs.lee.com(多个子域名). 配置session保存在memcache: ini_set(&q ...

  6. Asp.NET网站Session浅谈

    .NET网站在Web.config的<configuration>下<system.web>下<sessionState>配置session. sessionSta ...

  7. asp.net 二级域名session共享

    1.自定义类 namespace SessionShare{ public class CrossDomainCookie : IHttpModule { private string m_RootD ...

  8. asp.net网站防恶意刷新的Cookies与Session解决方法

    本文实例讲述了asp.net网站防恶意刷新的Cookies与Session解决方法,是WEB程序设计中非常实用的技巧.分享给大家供大家参考.具体实现方法如下: Session版实现方法: public ...

  9. Asp.net mvc与PHP的Session共享的实现

    最近在做的一个ASP.NET MVC的项目,要用到第三方的php系统,为了实现两个系统的互联互通.决定将两者的session打通共享.让asp.net mvc 和php 都能正常访问和修改Sessio ...

随机推荐

  1. P1341 当然是选择AC它了!(字符串处理)

    A. 当然是选择AC它了! 题目描述 听闻第八届程序设计大赛马上就要开始了,已经报名的童鞋们都纷纷去 OJ 刷题.但你的女朋友 (tan90°) 想知道她写的 "A + B 问题" ...

  2. 【jQuery实例】Ajax登录页面

    登录界面是信息系统提供的必备的功能,是提供给用户提供维护信息的接口.接下来,我来带领大家打造一个漂亮.安全的登录界面,使用的技术是ASP.NET+jQuery 先来看看预览效果   Ajax登录重点在 ...

  3. Spark学习之路 (八)SparkCore的调优之开发调优[转]

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

  4. [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

    解决方案 以前的cluster节点信息 保留 要删除 dump.rdb node.conf集群启动时自动生成文件

  5. 两个html页面之间传值

    参考网址:https://blog.csdn.net/csdn_ds/article/details/78393564?locationNum=8&fps=1

  6. vue里使用element饿了么的el-menu+vue-router实现路由跳转的两种方法

    最近准备写一个echarts的可视化展示案例,首先用vue-cli3创建了一个项目(好像vue-cli4也出来,感觉变化不大,就没升级了) 然后,开始配置路由↓下面是我的router.js文件 imp ...

  7. 3级搭建类301-Oracle 11g RAC 双节点搭建(11.2.0.4)非公

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  8. 深入浅出Mybatis系列八-mapper映射文件配置之select、resultMap

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之inse ...

  9. C++野指针的存在方式和误区

    1. char* x;这样的一定是野指针,指针声明时要直接初始化!或者置null也行! 2. int main() { char *x=new char; delete x; cout<< ...

  10. vue router的其他属性、 值的传递 、 懒加载

    路由的router-link标签有几个其他属性: 路由可以传递值(一般用作条目的id传递,之后用这个id从axios获取页面显示的数据 第一步: 定义路由以及值的属性名称(之后在跳转路由后页面里面获取 ...