[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[文章整理][asp.net]关于session过期的判断

上一篇:CS 插件下载网址,国外的。
下一篇:[文章整理]虚拟主机用户access数据库防下载方法

添加日期:2006/2/15 10:46:06 快速返回   返回列表 阅读10095次
原帖地址: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);
    }
}

 

评论 COMMENTS
楼主
2013/4/20 6:43:05
然后,所有页面都继承basePageSessionExpire类就行了。

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved