欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于asp.net 监测Session是否过期的问题

程序员文章站 2022-06-11 11:41:51
...

如果是在aspx 文件中监测session 是否过期的话,我们可以写个从Page类继承的BasePage类,然后每个aspx对应的处理类继承BasePage 就可以了。

public class BasePage:Page
{
    public BasePage()
    {
        Load += new EventHandler(BasePage_Load);
    }

    private void BasePage_Load(object sender, EventArgs e)
    {
        UserInfo userInfo = Session["UserInfo"] as UserInfo;
        if (userInfo == null)
        {
            //跳转到首页
            //Response.Redirect("~/Default.aspx");
            Server.Transfer("~/Default.aspx");
        }
    }
}

也可以重写OnInit()方法来判断Session情况。

如果在ajax调用中检查session是否失效上面的方法就不灵了。

如果 是ajax + ashx 的方法来实现的异步调用话:

        // Find the URL in the link right next to us, then fetch the data
        $.ajax({
            url: "../test.ashx",
            type: "GET",
            dataType: "json",
            success: onDataReceived
        });

这样我们可以这样来实现检查session是否失效:

/// <summary>
///ashx 文件对应的基类 用于判断用户是否登录(Session是否过期)
/// </summary>
public class BaseHandlerClass:IHttpHandler,IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        if (context.Session == null)
        {
            //context.Response.StatusCode = 405;
            //context.Response.End();
            //跳转到首页
            context.Response.Redirect("~/Default.aspx");
        }
        if (context.Session["UserInfo"] == null)
        {
            //context.Response.StatusCode = 405;
            //context.Response.End();
            //跳转到首页
            context.Response.Redirect("~/Default.aspx");
        }
        OnLoad(context);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
    /// <summary>
    /// 代码实现
    /// </summary>
    /// <param name="context"></param>
    public virtual void OnLoad(HttpContext context)
    {
        //子类可以重写此函数来实现业务处理
    }
}
然后ashx 对应的处理类继承上面的类并重写OnLoad函数来处理具体业务。

但如果用的是ajaxpro 的方式实现异步调用呢?或是ajax + ashx 和Ajaxpro 都用呢?
看文章有写可以用重写IHttpModule的方法来实现

namespace JudgeSessionOutTime
{
    public class Module:IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        //2.在Init()方法中对Context进行注册AcquireRequestState事件。
        public void Init(HttpApplication context)
        {
            context.AcquireRequestState+=new EventHandler(context_AcquireRequestState);
        }

        //3.完善AcquireRequestState方法,然后判断session过期
        public void context_AcquireRequestState(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;

            if (app.Context.Request.RawUrl.EndsWith("aspx") || app.Context.Request.RawUrl.EndsWith("ashx"))
            {
                if (app.Context.Request.RawUrl.EndsWith("Default.aspx") || app.Context.Request.RawUrl.EndsWith("Login.aspx")) return;
                if (app.Context.Session["UserInfo"] == null)
                {
                    app.Response.Write("<script>alert('session到期!');</script>");
                }
            }
        }
     }   
}

然后在web.config 中添加

<httpModules> 
      <!--重写IHttpModule类,需要配置的信息-->
      <!--<add name="JudgeSessionOutTime" type="JudgeSessionOutTime.Module"/>-->
      <!--type后面是命名空间.类名-->
</httpModules>

在context_AcquireRequestState进行session判断,但所有的Ajaxpro的请求都是通过下面的

<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/prototype.ashx" type="text/javascript">
<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/core.ashx" type="text/javascript">
<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/converter.ashx" type="text/javascript">
<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/Login,App_Web_mdrbqjr9.ashx" type="text/javascript">

中的prototype.ashx、core.ashx、converter.ashx 和App_web_mdrbqjr9.ashx 来实现的,这样就很难过滤。
一劳永逸的方法还未实现,研究中。。。。。。。。。。。

转载于:https://my.oschina.net/u/267603/blog/420587