麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > .NET > 正文

詳解.net mvc session失效問題

2024-07-10 13:31:23
字體:
供稿:網(wǎng)友

最近在研究有關(guān).net mvc項目中的session失效問題,下面小編把研究過程給大家共享下,大家可以參考下。

最近解決基于.net mvc項目的session失效問題,這個跟大家聊聊。

1.問題分析

.net mvc中,Session失效需要考慮幾種情況:

•基于權(quán)限認(rèn)證的Action,使用非Ajax請求;

•基于權(quán)限認(rèn)證的Action,使用JQueryt Ajax請求;

•基于權(quán)限認(rèn)證的Action,使用.net mvc封裝的Ajax請求;

•無權(quán)限認(rèn)證的Action,使用非Aajx請求;

•無權(quán)限認(rèn)證的Action,使用原生JQuery Ajax請求;

•無權(quán)限認(rèn)證的Action,使用.net mvc封裝的Ajax請求;

基于權(quán)限認(rèn)證的Action,session失效后AuthorizeAttribute都可以攔截,并在HandleUnauthorizedRequest方法中處理;無權(quán)限認(rèn)證的Action需要在自定義的filter中,根據(jù)新建Session與已請求Session的區(qū)別進(jìn)行判斷和處理。

2.基于權(quán)限認(rèn)證的非Ajax請求

Authorize filter優(yōu)先于其他功能過濾器執(zhí)行,因此這里繼承AuthorizeAttribue,在HandleUnauthorizedRequest中處理session請求。

public class AuthorizeOfHandleUnAuthorizeAttribute:AuthorizeAttribute{protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){//session失效重定向到登錄頁面filterContext.Result =new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", Action = "Login" }));}}

3.基于權(quán)限認(rèn)證的Ajax請求

Ajax請求的Action在系統(tǒng)中存在兩種返回結(jié)果:JsonResult和PartialViewResult。

•JsonResult理論上可以通過在返回的結(jié)果上增加session超期屬性,客戶端進(jìn)行判斷即可。但是考慮到項目已經(jīng)完成,在所有ajax請求上增加判斷邏輯有些繁瑣。

服務(wù)端代碼處理ajax請求:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){//ajax請求session超期處理if (filterContext.HttpContext.Request.IsAjaxRequest()){filterContext.HttpContext.Response.AppendHeader("sessionstatus","timeout");filterContext.HttpContext.Response.End();return;}filterContext.Result =new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", Action = "Login" }));}

客戶端代碼(這種處理方式對于返回結(jié)果為PartialViewResult的Action是不適用的):

onSuccess: function (xhr, status) {//獲取響應(yīng)頭,sessionstatus,var sessionstatus = xhr.getResponseHeader("sessionstatus");if (sessionstatus == "timeout") {window.location = "/Login/Login";}}

•PartialViewResult情況的存在,直接否定上面的設(shè)想。項目中大部分Ajax請求都是基于.net mvc封裝的,直接更新指定div。

為了不做大量更改、且統(tǒng)一處理兩種返回結(jié)果的ajax請求,找到了另外一種方法

jQuery.ajaxSetup()

該函數(shù)用于更改jQuery中AJAX請求的默認(rèn)設(shè)置選項。之后執(zhí)行的所有AJAX請求,如果對應(yīng)的選項參數(shù)沒有設(shè)置,將使用更改后的默認(rèn)設(shè)置。

因此我們的客戶端代碼可以這樣統(tǒng)一處理:

//解析ajax請求session超時問題$.ajaxSetup({complete: function(xmlHttpRequest, textStatus) {var sessionStatus = xmlHttpRequest.getResponseHeader("sessionstatus");if (sessionStatus === "timeout") {window.location = "/Login/Login";}}});

本以為到這里就萬事大吉啦,結(jié)果一不小心又發(fā)現(xiàn)一個問題,基于.net mvc的jquery.unobtrusive-ajax封裝的ajax請求調(diào)用,沒有達(dá)到攔截處理的效果。經(jīng)過反復(fù)調(diào)試無果,最終還是注意到上面那段話

jQuery.ajaxSetup()該函數(shù)用于更改jQuery中AJAX請求的默認(rèn)設(shè)置選項。之后執(zhí)行的所有AJAX請求,如果對應(yīng)的選項參數(shù)沒有設(shè)置,將使用更改后的默認(rèn)設(shè)置。

這里說的比較明白了,那肯定就是jquery.unobtrusive-ajax封裝的時候搗的鬼啦,翻開源碼一看果然如此:

$.extend(options, {type: element.getAttribute("data-ajax-method") || undefined,url: element.getAttribute("data-ajax-url") || undefined,cache: !!element.getAttribute("data-ajax-cache"),beforeSend: function (xhr) {var result;asyncOnBeforeSend(xhr, method);result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(element, arguments);if (result !== false) {loading.show(duration);}return result;},complete: function (xhr,status) {loading.hide(duration);getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(element, arguments);},success: function (data, status, xhr) {asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(element, arguments);},error: function () {getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"]).apply(element, arguments);}});

我們看到j(luò)query.unobtrusive-ajax注冊了ajax請求的compelete事件,因此我們寫的默認(rèn)處理程序就被覆蓋啦。實在沒想到什么好辦法,只好改下jquery.unobtrusive-ajax的源碼了:

complete: function (xhr,status) {loading.hide(duration);//解析ajax請求session超時問題var sessionStatus = xhr.getResponseHeader("sessionstatus");if (sessionStatus === "timeout") {window.location = "/Login/Login";}getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(element, arguments);},

 

至此,基于認(rèn)證的ajax請求session失效問題基本解決,存在兩個瑕疵:

•修改了jquery.unobtrusive-ajax的源碼,總感覺心里別扭;

•任何注冊了compelete事件的ajax請求,都需要自己處理session問題。

4.無權(quán)限任務(wù)的Action

無權(quán)限認(rèn)證的Action的Session失效問題,處理代碼如下:

if (filterContext.HttpContext.Session != null){if (filterContext.HttpContext.Session.IsNewSession){var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];if (sessionCookie != null&&sessionCookie.IndexOf("ASP_NET_SessionId",StringComparison.OrdinalIgnoreCase)>=0){filterContext.Result =new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", Action = "Login" }));}}}

無權(quán)限認(rèn)證的Action的Ajax可以仿照上面有權(quán)限認(rèn)證的處理方法處理,這里就不再粘代碼啦。個人感覺,無權(quán)限認(rèn)證的Action請求,大多可以不用考慮session失效情況,因為這些Action大多不從session里獲取信息,只是做公共信息的查詢。

5.遺留問題

至此問題基本解決,但是過程中遇到了一個莫名其妙的問題,暫且記下:

我原本通過在配置文件把session超期時間設(shè)置的很小來模擬session失效,結(jié)果發(fā)現(xiàn)項目現(xiàn)有框架總會莫名奇妙的在登錄后的第一個業(yè)務(wù)請請求時把session超期時間改為60分鐘,沒有找到為什么。后來只能通過在同一個瀏覽器打開兩個tab頁,登錄系統(tǒng)后,在一個tab頁推出的方法模擬。

以上所述是小編給大家介紹的.net mvc session失效問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到ASP.NET教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 二区视频 | 91精品国产成人 | 黄色a级片免费观看 | 免费一级毛片在线播放视频老 | 九色国产| 中文字幕在线观看视频一区 | 欧美成人免费在线视频 | 黄色影院av | 成av人在线观看 | 一级黄色影片在线观看 | 国产成年免费视频 | 欧美一级淫片免费视频黄 | 久久久久久久久成人 | 国产91中文字幕 | 特一级毛片 | 亚洲网站在线观看视频 | 久久久久久久久久综合 | 欧美成人一区二区三区 | 成人在线免费观看网址 | 激情黄页 | 国人精品视频在线观看 | 亚洲成人中文字幕在线 | 久久影院在线观看 | 国产成人精品自拍视频 | 99视频在线观看视频 | 国产www免费| 91九色视频观看 | 一区二区视频在线看 | 久久久久久久久久网站 | 久久成人国产精品入口 | 九九热视频免费观看 | 欧美精品国产综合久久 | 天天黄色片 | 国产精品久久久久久久成人午夜 | 亚洲国产精品久久久久久久久久久 | 国产精品久久久久网站 | 欧美不卡视频在线观看 | 免费一级在线观看 | 最新亚洲国产 | 欧美成人免费在线视频 | av黄色片网站|