MVC Session消失之後導回登入頁

  • 736
  • 0
  • MVC
  • 2019-06-26

在MVC的專案架構底下,判斷Session是否還存在,不存在的話導回登入頁

在做專案的時候,會需要判斷Session是否還存在,

如果不存在之後要導回登入頁,

目前我的作法是在所有的controller都會繼承一個BaseController,

在BaseController 用自訂的 AuthorizeAttribute

在自訂AuthorizeAttribute之前,目前專案內View在發出POST到Controller的行為有分為兩種,

1.Form Post

2.在JS內用AJAX

這兩種呼叫的方式在自訂AuthorizeAttribute內會有不一樣的回傳行為

public override void OnAuthorization(AuthorizationContext filterContext)
{
	EMP_Info empInfo = (EMP_Info)filterContext.HttpContext.Session["EMP_INFO"];
      //AJAX呼叫
	if (filterContext.HttpContext.Request.IsAjaxRequest())
	{                
		if (empInfo == null)
		{
			filterContext.Result = new JsonResult
			{
				Data = new
				{
					ReturnCode = "888",
					ReturnMessage = "請重新登入!"
				},
				JsonRequestBehavior = JsonRequestBehavior.AllowGet
			};
		}                    
	}
	else
	{
        // 一般Submit Button的POST事件
		if (empInfo == null)
		{                    
			filterContext.Result = new RedirectResult("~/SSO/SSOLogin");
		}
	}
}

如果是ajax呼叫,在前端JS的部分再做一些調整

var _Object = {EditEMPID: $('#hidEditEMPID').val()};

$.ajax({
	type: "POST",
	url: '../AU/CheckAUStateBeforeModify',
	data: JSON.stringify(_Object),
	async: false,
	contentType: "application/json; charset=utf-8",
	dataType: "json",
	success: function (_result) {
		if (_result.ReturnCode == '000') {
			_checkBeforeSubmitFlag = true;
		}
		else if (_result.ReturnCode == '888') {
		    // 先顯示提示訊息
			alert(_result.ReturnMessage);
			// 目前的專案是用IFrame,呼叫parent的Logout做登出,並導回登入頁
			if (parent.Logout != undefined)
			{
				parent.Logout();
			}                                              
		}
		else {
			alert(_result.ReturnMessage);
		}
	},
	error: function (error) {
		alert('error: ' + error);
	}
});