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

若是是在aspx 文件中监测session 是否过时的话,咱们能够写个从Page类继承的BasePage类,而后每一个aspx对应的处理类继承BasePage 就能够了。javascript

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状况。html

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

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

        // 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是否失效:ajax

/// <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的方法来实现json

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 中添加c#

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

在context_AcquireRequestState进行session判断,但全部的Ajaxpro的请求都是经过下面的session

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

相关文章
相关标签/搜索