關於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

相關文章
相關標籤/搜索