.Net Mvc 사용자 로그인 여부, 로그인하지 않은 경우 다시 로그인 페이지로 이동, 3가지 완벽한 솔루션 판단

34784 단어
개편에서 먼저 설명을 하지 않고 사용자가 로그인했는지 아닌지를 어떻게 판단하는지 살펴본다. 우리는 먼저 사용자가 로그인한 부분의 코드를 보고 계정 비밀번호가 모두 정확한 후에 현재 로그인한 사용자 이름을 기록한다.
 1         public ActionResult ProcessLogin()
 2         {
 3             try
 4             {
 5                 string user_name = Request["LoginId"];
 6                 string user_pwd = Request["LoginPwd"];
 7                 UserInfo model = new UserInfo();
 8                 model.UName = user_name;
 9                 model.UPwd = user_pwd;
10                 if (bllSession.UserInfo.Select(model).Count > 0) //           
11                 {
12                     Session["loginUser"] = user_name; //          
13                     return Content("ok");
14                 }
15                 else
16                 {
17                     return Content("        !     ?");
18                 }
19             }
20             catch (Exception ex)
21             {
22                 throw ex;
23             }
24         }

다음은 사용자 로그인을 검사하는 몇 가지 방법을 보여 줍니다


방식 1


각 페이지가 실행되기 전에 현재 사용자의 로그인 여부를 판단합니다. 만약에 로그인해야 현재 페이지에 들어갈 수 있습니다. 로그인하지 않으면 첫 페이지로 돌아갑니다. 사이트의 페이지가 적으면 각 페이지에 이 방법을 추가할 수 있습니다. 프로젝트 모듈이 점점 많아지면서 스티커를 어떻게 복사하려고 합니까?Don't repeat youself!

1         public ActionResult Index()
2         {
3             if (Session["loginUser"] == null)
4             {
5                 return RedirectToAction("Index", "UserLogin");
6             }
7             return View();
8         }

방식 2


전역 필터에서 사용자가 로그인했는지 확인


검증 클래스 생성(LoginCheckFilterAttribute.cs)
 1 using System.Web.Mvc;
 2 
 3 namespace Sam.OA.WEBAPP.Models
 4 {
 5     /// 
 6     ///            
 7     /// 
 8     public class LoginCheckFilterAttribute: ActionFilterAttribute  //    :ActionFilterAttribute
 9     {
10         /// 
11         ///     ,   true
12         /// 
13         public bool IsChecked { get; set; }
14         public override void OnActionExecuted(ActionExecutedContext filterContext)
15         {
16             base.OnActionExecuted(filterContext);
17             //         
18             if (IsChecked)
19             {
20                 if (filterContext.HttpContext.Session["loginUser"] == null)
21                 {
22                     filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
23                 }
24             }
25         }
26     }
27 }

在全局过滤器中添加这方法(FilterConfig.cs)

 1 using Sam.OA.WEBAPP.Models;
 2 using System.Web.Mvc;
 3 
 4 namespace Sam.OA.WEBAPP
 5 {
 6     public class FilterConfig
 7     {
 8         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 9         {
10             //filters.Add(new HandleErrorAttribute());
11             filters.Add(new MyExceptionFilterAttribute()); //        
12 
13             //
14             filters.Add(new LoginCheckFilterAttribute() { IsChecked=true});
15         }
16     }
17 }

이렇게 되면 모든 페이지가 사용자가 로그인했는지 검사할 것이다. 그러나 실제적으로 하필 일부 부분은 사용자가 로그인했는지 검사할 필요가 없다. 예를 들어 로그인 페이지, 이때 우리는 어떻게 이 문제를 해결합니까?우리는 클래스에 라벨을 붙일 수 있다


사용자 로그인 컨트롤러(UserLoginController.cs) 1 using Sam.OA.BLLFactory; 2 using Sam.OA.Model.Sam; 3 using Sam.OA.WEBAPP.Models; 4 using System; 5 using System.Web.Mvc; 6 7 namespace Sam.OA.WEBAPP.Controllers 8 { 9 /// 10 ///11 /// 12 [LoginCheckFilterAttribute(IsChecked =false)] 13 public class UserLoginController : Controller 14 { 15 // GET: UserLogin 16 public ActionResult Index() 17 { 18 return View(); 19 } 20 IBllSession bllSession = BllSessionFactory.GetCurrentBllSession(); 21 /// 22 /// 23 /// 24 /// 25 public ActionResult ProcessLogin() 26 { 27 try 28 { 29 string user_name = Request["LoginId"]; 30 string user_pwd = Request["LoginPwd"]; 31 UserInfo model = new UserInfo(); 32 model.UName = user_name; 33 model.UPwd = user_pwd; 34 if (bllSession.UserInfo.Select(model).Count > 0) // 35 { 36 Session["loginUser"] = user_name; 37 return Content("ok"); 38 } 39 else 40 { 41 return Content(" ! ?"); 42 } 43 } 44 catch (Exception ex) 45 { 46 throw ex; 47 } 48 } 49 } 50 }

이렇게 되면 문제가 완벽하게 해결되어 사용자가 로그인했는지 확인할 필요가 없는 곳에 라벨을 붙일 필요가 없습니다~~~


사각형 3


컨트롤러 기본 클래스(BaseController.cs)를 수동으로 만듭니다. 1 using System.Web.Mvc; 2 3 namespace Sam.OA.WEBAPP.Controllers 4 { 5 /// 6 /// 7 /// 8 /// :2019 8 22 23:53:35 9 /// 10 public class BaseController:Controller 11 { 12 public bool IsCheckedUserLogin = true; 13 protected override void OnActionExecuted(ActionExecutedContext filterContext) 14 { 15 base.OnActionExecuted(filterContext); 16 // 17 if (IsCheckedUserLogin ) 18 { 19 if (filterContext.HttpContext.Session["loginUser"] == null) 20 { 21 filterContext.HttpContext.Response.Redirect("/UserLogin/Index"); 22 } 23 } 24 } 25 } 26 }

이때, 우리가 검사해야 할 컨트롤러는 모두 계승 컨트롤러의 기본 클래스로 바꾸었다

1 using Sam.OA.BLLFactory; 2 using Sam.OA.Model.Sam; 3 using System.Web.Mvc; 4 5 namespace Sam.OA.WEBAPP.Controllers 6 { 7 /// 8 /// :Controller :BaseController 9 /// 10 public class UserInfoController : BaseController //:Controller 11 { 12 // GET: UserInfo 13 IBllSession bll = BllSessionFactory.GetCurrentBllSession(); 14 public ActionResult Index() 15 { 16 UserInfo model = new UserInfo(); 17 ViewData.Model = bll.UserInfo.Select(model,"1=1"); 18 return View(); 19 } 20 public ActionResult Create() 21 { 22 return View(); 23 } 24 [HttpPost] 25 public ActionResult Create(UserInfo model) 26 { 27 if (ModelState.IsValid) 28 { 29 bll.UserInfo.Add(model); 30 } 31 return RedirectToAction("Index"); 32 } 33 } 34 }

그러면 문제가 또 생겼습니다. 몇몇 페이지는 검사를 하지 않으면 어떻게 합니까?기류를 계승하지 않거나, 아래의 방법에 따라 배치하면, 매우 유연하다고 느끼지 않겠는가

1 using Sam.OA.BLLFactory; 2 using Sam.OA.Model.Sam; 3 using System; 4 using System.Web.Mvc; 5 6 namespace Sam.OA.WEBAPP.Controllers 7 { 8 public class UserLoginController :BaseController //:Controller 9 { 10 public UserLoginController() 11 { 12 this.IsCheckedUserLogin = false; // 13 } 14 // GET: UserLogin 15 public ActionResult Index() 16 { 17 return View(); 18 } 19 IBllSession bllSession = BllSessionFactory.GetCurrentBllSession(); 20 /// 21 /// 22 /// 23 /// 24 public ActionResult ProcessLogin() 25 { 26 try 27 { 28 string user_name = Request["LoginId"]; 29 string user_pwd = Request["LoginPwd"]; 30 UserInfo model = new UserInfo(); 31 model.UName = user_name; 32 model.UPwd = user_pwd; 33 if (bllSession.UserInfo.Select(model).Count > 0) // 34 { 35 Session["loginUser"] = user_name; 36 return Content("ok"); 37 } 38 else 39 { 40 return Content(" ! ?"); 41 } 42 } 43 catch (Exception ex) 44 { 45 throw ex; 46 } 47 } 48 } 49 }

이상 모든 문제가 완벽하게 해결되었습니다~

좋은 웹페이지 즐겨찾기