프로그래머의 Asp.net MVC 세션 만료 예외 처리
7322 단어 asp.net
목차를 읽습니다.
1. 세션이 일으킨 이상
2. MVC의 Filter를 사용하여 Session 검증
3. Ajax 요청의 경우 Session 무효 처리
4. 세션 만료 이상 처리의 중요성
하나, 세션이 일으킨 이상
조 군은 회사에 들어오자마자 실제 프로젝트에 참여했다. 프로젝트는 Asp를 사용했다.net MVC.조 군은 약 2주 만에 모든 기능을 완성해 QA 테스트에 제출했다.
하루가 지나자 QA가 테스트 결과를 보냈는데 조 군이 한 번 지나자 자신이 만든 물건이 이렇게 문제가 많은 것을 발견했다.
버그 중 하나는 다음과 같습니다.
Firefox를 사용하여 시스템에 로그인한 후 Tab을 열고 시스템 페이지에 들어가logout을 누르십시오.이전tab 페이지로 돌아가서 Save 단추를 누르면 js 오류가 발생합니다.이럴 때는 반드시 사용자를 로그인 페이지로 돌려야 한다.
조 군은 이 버그를 보고 어안이 벙벙해졌다. QA가 이렇게'폭력적'방식으로 자신의 프로그램을 테스트할 줄은 몰랐다.다른 탭에서 logout을 클릭하면session이 비워집니다. 이렇게 첫 번째 탭의 Save 단추를 누르면 호출된 Ajax 방법에 이상이 발생합니다.
그러나 이런 비정상적인 조작으로 인한 이상을 어떻게 처리합니까?
둘째, MVC의 Filter를 사용하여 Session 검증
조 군이 자료를 조사한 결과 MVC에 있는 AuthorizationFilter가 Controller에 실제로 접근하기 전에 요청을 차단할 수 있는 것을 발견했다. 이때 여기서 Session의 유효성을 검사할 수 있고 Session이 효력을 상실한 것을 발견하면 사용자를 로그인 페이지로 돌려보낼 수 있다.(MVC Filter에 대해서는 4여기. 클릭 가능)
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
filterContext.Result = new RedirectResult(redirectUrl);
return;
}
}
}
셋째, Ajax 요청의 경우 Session 무효 처리
Ajax 요청에서 세션이 만료되면 위의 방법을 사용하면 효과를 볼 수 없습니다.실현된 사고방식은 Ajax 요청이 발견되면 특정 형식의 Json 데이터를 되돌려주고 클라이언트가 이 데이터를 처리하여Session이 효력을 상실한 상황을 발견하면 로그인 페이지로 넘어가는 것이다.
우선, MyAuthorize Attribute를 확장합니다.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
if(!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectResult(redirectUrl);
}
else
{
filterContext.Result = new JsonResult
{
Data = new
{
Success = false,
Message = string.Empty,
Redirect = redirectUrl
}
};
}
return;
}
}
요청이 Ajax에서 온 경우 다음과 같이 Json Result를 반환합니다.
$.ajax({
type: "POST",
url: "@Url.ContactInfoAjax()",
success: function (msg) {
if (msg.Success) {
…….
}
if (msg.Redirect) {
window.location = msg.Redirect;
}
}
});
넷째, 세션 만료 예외 처리의 중요성
솔직히 개발자가 프로젝트를 시작할 때 코드가 실현되는 기능, 즉 프로그램이 정상적으로 작업할 때의 상태에 더 많은 관심을 가지지만'비정상적인'상황에서 고려하는 것은 매우 적다.이런 부분에 대한 고려가 우리로 하여금 더욱 전문적인 프로그래머가 되어 풋내기의 처지에서 벗어나게 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.