国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

詳解.net mvc session失效問(wèn)題

2024-07-10 12:54:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我們?cè)陂_(kāi)發(fā)程序的時(shí)候,可能會(huì)遇到很多問(wèn)題,對(duì)于session也許會(huì)引起很多異常,導(dǎo)致程序崩潰,這個(gè)時(shí)候我們要怎么操作呢?別急,錯(cuò)新技術(shù)頻道小編將為大家?guī)?lái)詳解.net mvc session失效問(wèn)題。

1.問(wèn)題分析

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

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

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

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

?無(wú)權(quán)限認(rèn)證的Action,使用非Aajx請(qǐng)求;

?無(wú)權(quán)限認(rèn)證的Action,使用原生JQuery Ajax請(qǐng)求;

?無(wú)權(quán)限認(rèn)證的Action,使用.net mvc封裝的Ajax請(qǐng)求;

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

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

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

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

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

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

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

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

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){//ajax請(qǐng)求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" }));}

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

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

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

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

jQuery.ajaxSetup()

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

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

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

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

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

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

$.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注冊(cè)了ajax請(qǐng)求的compelete事件,因此我們寫(xiě)的默認(rèn)處理程序就被覆蓋啦。實(shí)在沒(méi)想到什么好辦法,只好改下jquery.unobtrusive-ajax的源碼了:

complete: function (xhr,status) {loading.hide(duration);//解析ajax請(qǐng)求session超時(shí)問(wèn)題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請(qǐng)求session失效問(wèn)題基本解決,存在兩個(gè)瑕疵:

?修改了jquery.unobtrusive-ajax的源碼,總感覺(jué)心里別扭;

?任何注冊(cè)了compelete事件的ajax請(qǐng)求,都需要自己處理session問(wèn)題。

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

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

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" }));}}}

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

5.遺留問(wèn)題

至此問(wèn)題基本解決,但是過(guò)程中遇到了一個(gè)莫名其妙的問(wèn)題,暫且記下:

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

詳解.net mvc session失效問(wèn)題,錯(cuò)新技術(shù)頻道小編就為大家介紹到這里了,您有任何編程疑問(wèn)都可以來(lái)咨詢(xún)js.VeVb.com哦!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南昌县| 登封市| 胶南市| 丘北县| 赤壁市| 锡林浩特市| 姚安县| 桐乡市| 福贡县| 乐亭县| 花莲市| 安新县| 固原市| 衡阳市| 闽清县| 桦南县| 和硕县| 启东市| 拉孜县| 元氏县| 桐庐县| 万载县| 岑溪市| 民权县| 介休市| 甘南县| 蓬莱市| 尼木县| 若尔盖县| 曲水县| 新建县| 尚义县| 仁寿县| 龙海市| 武义县| 峨眉山市| 台州市| 榆树市| 交城县| 元氏县| 山阳县|