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

如果是在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 来实现的,这样就很难过滤。
一劳永逸的方法还未实现,研究中。。。。。。。。。。。

你可能感兴趣的:(Ajax,session,失效,ajaxpro)