EF架构~二级域名中共享Session
对于一个有点规模的网站,都会有各个子网站,说是子网站,其实也都是独立的站点,一般通过二次域名来分开,如www.zzl.com,它可以有很多子网站,如image.zzl.com,file.zzl.com,sale.zzl.com,manage.zzl.com,news.zzl.com等等!
而如果希望在各个项目中共享你的登陆状态,我们通过的做法是通过cookies实现,但使用cookies就有安全性的问题,因为它的信息保存在客户端,这是重所周知的,而session本身不支持跨域,即使是二级域名,也是不可以的.(cookies可以在各二级域名中共享信息),当然,这只是对于inpro的存储方式来说的,如果你是sqlserver或者StateServer的方法,那么,通过一些设置,还是可以实现session的跨域的,下面来说一下实现方式.
一 建立一个httpModule,在页面加载完成后,执行这个方法,将域名的asp.net_sessionId重写
/// <summary> /// session共享sessionId /// </summary> public class SessionProviderHttpModule : IHttpModule { private string m_RootDomain = string.Empty; public void Dispose() { } public void Init(HttpApplication context) { m_RootDomain = ".mvvm.com"; Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore"); FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic); if (uriField == null) throw new ArgumentException("UriField was not found"); uriField.SetValue(null, m_RootDomain); context.EndRequest += new System.EventHandler(context_EndRequest); } 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; } } } }
二 将这个httpModule注入到项目中
web.config方法
<sessionState cookieless="false" timeout="50" mode="StateServer" stateConnectionString="tcpip=localhost:42424"/> <httpModules> <add name="CrossDomainCookieModule" type="EntityFrameworks.Application.Core.HttpModule.SessionProviderHttpModule,EntityFrameworks.Application.Core"/> </httpModules>
预处理程序方法
/// <summary> /// 预处理代码 /// </summary> public class PreApplicationStartCode { public static void Start() { // Register our module Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(EntityFrameworks.Application.Core.HttpModule.SessionProviderHttpModule)); } }
三 设置注册表相关项,启动asp.net的session服务,如图
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters
AllowRemoteConnection值为1,Port值可以任意设置,默认为42424
四 当我们设置好上面内容后,我们的session共享就完成了,测试后的结果,如图
通过图上我们可以看到,它们的ASP.NET_SessionId是相同的,我们知道,浏览器在没有进行用户session写入时,每次刷新,这个值都会变,但当用户使用session序列化后,这个值就固定了,当你把浏览器关闭后,这个值也同时消失,可以说,它是服务器端session的唯一标示,这个值如果相同,服务器就会认为,你的网站是在同一个域下的,它们的信息是共享的,反之,它们就是自立独立的,就像两个应用程序域一样,它们之间是不能相互通讯的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示