亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

詳解.net mvc session失效問題

2024-07-10 13:31:23
字體:
來源:轉載
供稿:網友

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

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

1.問題分析

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

•基于權限認證的Action,使用非Ajax請求;

•基于權限認證的Action,使用JQueryt Ajax請求;

•基于權限認證的Action,使用.net mvc封裝的Ajax請求;

•無權限認證的Action,使用非Aajx請求;

•無權限認證的Action,使用原生JQuery Ajax請求;

•無權限認證的Action,使用.net mvc封裝的Ajax請求;

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

2.基于權限認證的非Ajax請求

Authorize filter優先于其他功能過濾器執行,因此這里繼承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.基于權限認證的Ajax請求

Ajax請求的Action在系統中存在兩種返回結果:JsonResult和PartialViewResult。

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

服務端代碼處理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" }));}

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

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

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

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

jQuery.ajaxSetup()

該函數用于更改jQuery中AJAX請求的默認設置選項。之后執行的所有AJAX請求,如果對應的選項參數沒有設置,將使用更改后的默認設置。

因此我們的客戶端代碼可以這樣統一處理:

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

本以為到這里就萬事大吉啦,結果一不小心又發現一個問題,基于.net mvc的jquery.unobtrusive-ajax封裝的ajax請求調用,沒有達到攔截處理的效果。經過反復調試無果,最終還是注意到上面那段話

jQuery.ajaxSetup()該函數用于更改jQuery中AJAX請求的默認設置選項。之后執行的所有AJAX請求,如果對應的選項參數沒有設置,將使用更改后的默認設置。

這里說的比較明白了,那肯定就是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);}});

我們看到jquery.unobtrusive-ajax注冊了ajax請求的compelete事件,因此我們寫的默認處理程序就被覆蓋啦。實在沒想到什么好辦法,只好改下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);},

 

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

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

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

4.無權限任務的Action

無權限認證的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" }));}}}

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

5.遺留問題

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

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

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


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美色欧美亚洲高清在线视频| 国产日本欧美在线观看| 在线播放日韩精品| 日韩大陆欧美高清视频区| 日韩在线视频国产| 97在线视频观看| 最近2019年中文视频免费在线观看| 欧美中文在线视频| 亚洲xxxx18| 欧美一区二区三区……| 欧美日韩亚洲国产一区| 一区二区在线视频播放| 亚洲精品日韩久久久| 北条麻妃一区二区在线观看| 日韩不卡在线观看| 久久99国产综合精品女同| 欧美午夜精品伦理| 久久久久久美女| 81精品国产乱码久久久久久| 欧美综合国产精品久久丁香| 懂色av影视一区二区三区| 色悠久久久久综合先锋影音下载| 亚洲最新在线视频| 久久久成人的性感天堂| 中文字幕av一区中文字幕天堂| 欧美黄色三级网站| 中文字幕精品www乱入免费视频| 欧美激情视频给我| 久久99精品视频一区97| 久久久国产一区二区三区| 亚洲欧美日韩在线高清直播| 日韩大片免费观看视频播放| 国产精品久久久久久久久| 日韩精品丝袜在线| 欧美性少妇18aaaa视频| 麻豆国产精品va在线观看不卡| 国产亚洲一区精品| 黄色一区二区在线观看| 日韩电影中文字幕在线| 亚洲电影免费观看| 国产欧美日韩免费看aⅴ视频| 日韩三级影视基地| 亚洲社区在线观看| 国产精品久久久久久久久粉嫩av| 亚洲精品在线视频| 亚洲视频专区在线| 97欧美精品一区二区三区| 中文字幕一区日韩电影| 日本精品视频在线播放| 亚洲国产成人爱av在线播放| 一区二区三区久久精品| 久久中国妇女中文字幕| 国产中文字幕日韩| 国产欧美精品xxxx另类| 欧美综合在线观看| 国产日韩精品在线| 亚洲欧美精品伊人久久| 亚洲欧洲一区二区三区在线观看| 欧美精品成人在线| 欧美肥老太性生活视频| 亚洲欧美在线播放| 一本色道久久综合狠狠躁篇怎么玩| 岛国视频午夜一区免费在线观看| 亚洲日本中文字幕免费在线不卡| 91在线播放国产| 精品国产一区二区在线| 不用播放器成人网| 国产日韩在线免费| 亚洲性无码av在线| 97热精品视频官网| 欧美精品久久久久久久| 国模私拍视频一区| 欧美成人免费全部观看天天性色| 亚洲欧美激情视频| 欧美精品www| 日本欧美精品在线| 欧美插天视频在线播放| 久久精品美女视频网站| 久久69精品久久久久久久电影好| 亚洲人成人99网站| 91在线观看免费| 亚洲天堂免费观看| 2019中文在线观看| 国产精品国产三级国产专播精品人| 欧美日韩午夜激情| 国产精品极品美女在线观看免费| 久久国产精品久久精品| 午夜精品在线观看| 亚洲色图第三页| 国产精品扒开腿爽爽爽视频| 日韩二区三区在线| 日韩精品在线观看视频| 国产精品久久久久秋霞鲁丝| 一区二区三区视频免费在线观看| 91免费的视频在线播放| 欧美高清videos高潮hd| 国产精品第8页| 最近2019年中文视频免费在线观看| 国产在线999| 精品美女久久久久久免费| 精品久久久久久亚洲精品| 7777免费精品视频| 国产欧美最新羞羞视频在线观看| 国产日韩欧美夫妻视频在线观看| 亚洲精品日韩欧美| 国产精品国产三级国产aⅴ浪潮| 夜夜嗨av色综合久久久综合网| 国产91精品不卡视频| 亚洲国产女人aaa毛片在线| 久久国产精品网站| 欧美高清激情视频| 欧美一级黄色网| 成人黄色大片在线免费观看| 亚洲人精选亚洲人成在线| 久久久久久亚洲精品| 久久久视频在线| 亚洲色图18p| 97免费视频在线| 九九久久国产精品| 欧美国产视频日韩| 欧美极品在线播放| 欧美激情一区二区三区高清视频| 91九色视频导航| 亚洲精品自在久久| 超碰日本道色综合久久综合| 热99精品只有里视频精品| 欧美福利视频网站| 日韩电影中文字幕| 国产成人精品免高潮费视频| 久久久久久久久亚洲| 日本亚洲欧美三级| 91国偷自产一区二区三区的观看方式| 91免费高清视频| 欧美裸体xxxx极品少妇软件| 日韩精品在线播放| 亚洲国产天堂网精品网站| 国产精品av电影| 中文字幕精品久久久久| 亚洲欧美成人精品| 国产精品久久久久久久久免费| 亚洲美女精品成人在线视频| 日韩精品极品在线观看| 日韩黄在线观看| 亚洲女同性videos| 91精品国产色综合| 亚洲美女中文字幕| 97精品视频在线观看| 日韩欧美在线第一页| 欧美专区在线播放| 欧美成人三级视频网站| 91九色国产社区在线观看| 亚洲男人av在线| 国产日韩欧美夫妻视频在线观看| 久久亚洲国产精品| 国产精品丝袜久久久久久高清| 欧美日韩午夜视频在线观看| 欧美性xxxxxxx| 久久久之久亚州精品露出| 国产男女猛烈无遮挡91| 中文字幕自拍vr一区二区三区| 亚洲国产精久久久久久久| 欧美精品久久久久久久久| 久久久久久有精品国产| 欧美插天视频在线播放|