1. 程式人生 > >.net MVC 解決session超時失效的問題

.net MVC 解決session超時失效的問題

用於登入以後,將使用者資訊寫入session

public class HomeController:Controller{
    public ActionResult Login(){
        ....
        System.Web.HttpContext.Current.Session["id"] = RequestHandler.SafeInt(row["id"].ToString());
        System.Web.HttpContext.Current.Session["type"] = RequestHandler.SafeInt(row["type"
].ToString()); System.Web.HttpContext.Current.Session["name"] = row["name"].ToString(); .... } }

在UserBaseController的OnActionExecuting方法中驗證使用者的身份資訊

public class UserBaseController : Controller{
    protected override void OnActionExecuting(ActionExecutingContext filterContext){
        base
.OnActionExecuting(filterContext); if (System.Web.HttpContext.Current.Session["id"] == null) { if (Request.IsAjaxRequest() == true) { filterContext.Result = AjaxForbidden(); } else { filterContext.Result = Redirect("/Home/Index"
); } return; } } }

然後使用者的controller都繼承自UserBaseController,既可以實現許可權的檢查。

在.NET MVC中session的預設有效期是20分鐘,也就是說使用者在某個頁面停留超過20分鐘之後,再進行其他操作時就不能通過許可權檢查,因為對應的session[“id”]已經為null。

調整的方式是在專案的Web.config中進行配置,如下方式可以調整為60分鐘。

 <system.web>
    <sessionState mode="InProc" timeout="60" />
  </system.web>

但是配置完成之後,並沒有生效,session的有效期依然是20分鐘。

經過各種谷歌百度查詢之後,發現應該是應用程式池中的閒置超時沒有進行設定。
在網站對應的應用程式,高階設定,程序模型,閒置超時(分鐘)中也設定為60即可,親測可用。

session有效時間的具體測試方式如下:
1. 使用者訪問登入的頁面時,記錄訪問時間。
2. 使用者訪問登入之後的表單操作頁面時,記錄訪問時間。
3. 在表單操作頁面,通過javascript操作cookie實現遞增時間重新整理。
4. 通過日誌中的時間間隔就可以分析出,是在時間間隔為多少時,重新整理頁面之後,跳轉到了登入頁面(session失效)。

 <script>
 //javascript操作cookie實現遞增時間重新整理。
 //用到了amazeui操作cookie的api
        if ($.AMUI.utils.cookie.get("sessionTest") != null) {
            var minutes = parseInt($.AMUI.utils.cookie.get("sessionTest"));
        } else {
            var minutes = 1;
        }
        setTimeout(function () {
            window.location.reload();
        }, 60000 * minutes);
        minutes ++;
        $.AMUI.utils.cookie.set("sessionTest",minutes, 60, '/');
    </script>