若是是在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