原帖地址:http://www.blueidea.com/bbs/newsdetail.asp?id=2243449&posts=current] =============================================== 希望Session过期时,转到一个提示页。 关键是怎么判断Session已经过期。 不希望采用
if(Session["xx]=null){ ...Server.Transfer("xx.aspx"); } 的方法, 想弄一个共通的方法。
我找到一个用页基类的方法:
using System; public class basePageSessionExpire : System.Web.UI.Page { public basePageSessionExpire() { }
override protected void OnInit(EventArgs e) { base.OnInit(e);
if (Context.Session != null) {
if (Session.IsNewSession) {
string strCookieHeader = Request.Headers ["Cookie"]; if (null != strCookieHeader && strCookieHeader.IndexOf ("ASP.NET_SessionId") >= 0) { if (Request.IsAuthenticated) { System.Web.Security.FormsAuthentication.SignOut (); }
Response.Redirect ("../Session_Timeout.html"); } } } } }
已经证实有效。
但是,当一个主机同时存在多个虚拟目录,并且要进行虚拟目录间的迁移时, 第一次迁移到另一个虚拟目录时,也会报Session过期。
知道大概原因是: asp.net默认把所有虚拟目录的cookie都保存在一个目录下, 当浏览A虚拟目录时,会有A虚拟目录的cookie, 当浏览B虚拟目录时,还没有B的cookie,但是浏览器把A的cookie也放送给B了, (原因就是cookie都在一个目录下), 造成B的页面误判断(Session是新的,但是有cookie,认为是Session过期了)。
寻求解决方法!
====================== 已经知道一方法: 在Global.asax.cs的Session_Start中添加
HttpCookie oCookie = Response.Cookies["ASP.NET_SessionId"]; if (null != oCookie) { oCookie.Path = Request.ApplicationPath.ToLower(); }
意思是想把cookie的保存目录设置为一个子目录,这样每个虚拟目录就能区分开了。
但是,实际测试发现一些莫名其妙的问题。 ============================= 仍对上述问题,寻求解决办法, 我会为各位祈祷的,我会祝福大家一生幸福的,谢谢。 ============================================================= 主要是没人,会呀! 呵呵 ! 好高深的问题 ============================================================= HttpCookie oCookie = Response.Cookies["ASP.NET_SessionId"]; if (null != oCookie) { oCookie.Path = Request.ApplicationPath.ToLower(); }
我比较笨蛋,只是发表一点拙见,oCookie.Path在asp中很常用的,.net里面也差不多,你登陆如果你这个登陆是放在虚拟目录A里面的,我感觉这个path只会是A, 比如如果是http://192.168.0.0/Project/a和http://192.168.0./project/b,你可以直接手当设置这个path="/Project",而不去管是A还是B。这样的话应该在A和B这个虚拟目录下都可以用,如果还怕麻烦,干脆不设置这个PATH,让他只要浏览器不关闭都支持,不管任何目录或者HTTP头的情况下都支持! ============================================================= 哎,现在就是要把a,b区分开。 ============================================================= 搞定,只在IsPostBack的时候检查就可以了。
using System; public class basePageSessionExpire : System.Web.UI.Page { public basePageSessionExpire() { }
override protected void OnLoad(EventArgs e) { if(Page.IsPostBack){ if (Context.Session != null) { if (Session.IsNewSession) { string strCookieHeader = Request.Headers ["Cookie"]; if (null != strCookieHeader && strCookieHeader.IndexOf ("ASP.NET_SessionId") >= 0) { if (Request.IsAuthenticated) { System.Web.Security.FormsAuthentication.SignOut (); }
Response.Redirect("../Session_Timeout.html"); } } } } base.OnLoad(e); }
override protected void OnInit(EventArgs e) { base.OnInit(e); } }
|