最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年09月19日 09:10:23   作者:我打農(nóng)村來(lái)  
這篇文章主要介紹了.net mvc session失效問(wèn)題,本文通過(guò)問(wèn)題分析,解決過(guò)程分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下

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

最近解決基于.net mvc項(xiàng)目的session失效問(wèn)題,這個(gè)跟大家聊聊。

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)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • asp.net 文件路徑之獲得虛擬目錄的網(wǎng)站的根目錄

    asp.net 文件路徑之獲得虛擬目錄的網(wǎng)站的根目錄

    asp.net下獲取文件路徑常用代碼,獲得虛擬目錄的網(wǎng)站的根目錄
    2012-10-10
  • Asp.net導(dǎo)出Excel/Csv文本格式數(shù)據(jù)的方法

    Asp.net導(dǎo)出Excel/Csv文本格式數(shù)據(jù)的方法

    這篇文章主要介紹了Asp.net導(dǎo)出Excel/Csv文本格式數(shù)據(jù)的方法,比較實(shí)用,需要的朋友可以參考下
    2014-09-09
  • asp.net中強(qiáng)制取消TFS2008中其它成員的簽出文件的方法

    asp.net中強(qiáng)制取消TFS2008中其它成員的簽出文件的方法

    有個(gè)項(xiàng)目,以前的成員離職了,剛好又簽出了一個(gè)文件在TFS中并且上了鎖,導(dǎo)致后面的維護(hù)無(wú)法簽入和生成。在網(wǎng)上查了一下,找到了如下解決辦法
    2012-08-08
  • .Net中MoongoDB的簡(jiǎn)單調(diào)用圖文教程

    .Net中MoongoDB的簡(jiǎn)單調(diào)用圖文教程

    這篇文章主要給大家介紹了關(guān)于.Net中MoongoDB的簡(jiǎn)單調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • .NET Core如何進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn)

    .NET Core如何進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn)

    這篇文章主要介紹了.NET Core如何進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • ASP.NET MVC把表格導(dǎo)出到Excel

    ASP.NET MVC把表格導(dǎo)出到Excel

    這篇文章介紹了ASP.NET MVC把表格導(dǎo)出到Excel的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • .NET Core利用swagger進(jìn)行API接口文檔管理的方法詳解

    .NET Core利用swagger進(jìn)行API接口文檔管理的方法詳解

    這篇文章主要給大家介紹了關(guān)于.NET Core利用swagger進(jìn)行API接口文檔管理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 配置Spring.Net框架開(kāi)發(fā)環(huán)境

    配置Spring.Net框架開(kāi)發(fā)環(huán)境

    這篇文章介紹了配置Spring.Net框架開(kāi)發(fā)環(huán)境的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Asp.Net數(shù)據(jù)輸出到EXCEL表格中

    Asp.Net數(shù)據(jù)輸出到EXCEL表格中

    其實(shí),利用ASP.NET輸出指定內(nèi)容的WORD、EXCEL、TXT、HTM等類(lèi)型的文檔很容易的。主要分為三步來(lái)完成。
    2008-11-11
  • ASP.NET中訪問(wèn)DataGrid中所有控件值的方法

    ASP.NET中訪問(wèn)DataGrid中所有控件值的方法

    這篇文章主要介紹了ASP.NET中訪問(wèn)DataGrid中所有控件值的方法,涉及asp.net控件操作的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

云霄县| 丰县| 乡城县| 泾阳县| 吉隆县| 大兴区| 如东县| 天津市| 昭通市| 富蕴县| 呼图壁县| 山东省| 普兰县| 邻水| 郯城县| 抚顺县| 西和县| 高要市| 莱阳市| 通许县| 沙河市| 琼结县| 定结县| 鄂州市| 镇原县| 揭西县| 德安县| 临沧市| 永城市| 鄯善县| 渝中区| 金阳县| 崇文区| 夏津县| 通海县| 新邵县| 定西市| 缙云县| 广南县| 榆中县| 阜宁县|