大家好:有个问题想问问大家)
(1) 描述下问题: 在后台管理的其他Action前,添加登录筛选器。
未登录,自动跳转到登录页
已登录,记录申请访问的路径,并跳回。
(2)步骤
1.利用 CheckLoginFilder : ActionFilterAttribute //筛选器特性的抽象类
重写OnActionExecuting// 在执行操作方法之前由 ASP.NET MVC 框架调用。
2.在ArticleController/Index下 添加
[CheckLoginFilder]
public ActionResult Index()
/*----代码----*/
/*----重写OnActionExecuting ----*/
1 public class CheckLoginFilder : ActionFilterAttribute //筛选器特性的抽象类 2 { 3 public override void OnActionExecuting(ActionExecutingContext filterContext) 4 { 5 6 if (filterContext.Controller.ControllerContext.RequestContext.HttpContext.Session["UserLoginState"] == null) 7 { 8 string firstRquUrl = string.Empty; //记录未登录时访问的Url 9 if (filterContext.Controller.ControllerContext.RequestContext.HttpContext.Request.Url != null) 10 { 11 firstRquUrl = filterContext.Controller.ControllerContext.RequestContext.HttpContext.Request.Url.ToString(); 12 } 13 14 filterContext.Controller.ControllerContext.RequestContext.HttpContext.Session["RawUrl"] = firstRquUrl; 15 filterContext.Controller.ControllerContext.RequestContext.HttpContext.Response.Redirect("/Manage/User"); 16 17 }// the end Session["UserLoginState"]==null 18 base.OnActionExecuting(filterContext); 19 } 20 } 21
/*----在需要控制登录状态的Action 前添加自定义过滤器----*/
[CheckLoginFilder] //添加过滤器 public ActionResult Index() // GET: /Manage/Article/ { int articleType = String.IsNullOrEmpty(Request.QueryString["atid"]) ? (int)Utility.SpringHelper.ArticleType.CopyRightType : Convert.ToInt32(Request.QueryString["atid"]); IList<Article> articleList = articleCompontent.GetByCategorId(articleType); return View(articleList);//添加过滤器后,即使未登录也会访问视图? }
/*----cs:首页登录逻辑----*/
1 // GET: /Manage/User/ 2 public ActionResult Index() 3 { 4 string strUserName = Request.QueryString["username"]; //获取登录表单数据 5 string strUserPwd = Request.QueryString["userpwd"]; 6 if ((!string.IsNullOrEmpty(strUserName)) && (!string.IsNullOrEmpty(strUserPwd))) 7 { 8 if (userCompontent.GetLoginStateByUserId(strUserName.Trim(), strUserPwd.Trim())>0) 9 { 10 Session["UserLoginState"] = "1"; 11 if (Session["RawUrl"]!=null)//从CheckLoginFilder获取第一次访问失效的Url 12 { 13 string firstReqUrl = Session["RawUrl"].ToString();//记录RawUrl 14 Session.Remove("RawUrl"); //清空RawUrl 15 return Redirect(firstReqUrl); 16 } 17 Response.Write("<script>alert('登录成功')</script>");//;windows.location.href='/Manage/CopyRightCateGroyInfo/Index' 20 return RedirectToAction("Index", "CateGroyInfo"); //默认跳转的路由 21 } 22 else 23 { 24 Response.Write("<script>alert('登录失败,请检查用户名或密码是否正确');</script>"); 25 return View(); 26 } 27 } 28 else 29 { 30 return View(); 31 } 32 33 }
(3)遇到的问题
添加自定义过滤标签后,即使在未登录的状态下,访问Article/Index,也会执行 Rerurn View("Article")视图。
大家有实现过相关的逻辑么,怎样在添加过滤器后,不访问视图,直接跳转回登录页。
因为豆子确实不多,谢谢大家:)
在Global.asax.cs的Application_Start中注册CheckLoginFilder这个Filter了吗?
1 protected void Application_Start() 2 { 3 4 AreaRegistration.RegisterAllAreas(); 5 ModelBinderProviders.BinderProviders.Add(new CheckLoginFilder()); //? 这里注册么 6 //WebApiConfig.Register(GlobalConfiguration.Configuration); 7 8 // FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 9 RegisterGlobalFilters(GlobalFilters.Filters); 10 //RouteConfig.RegisterRoutes(RouteTable.Routes); 11 RegisterRoutes(RouteTable.Routes); 12 13 }
老师好,是在这里注册么,问题有些弱弱的,请你原谅:)
@Frank铭:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CheckLoginFilder()); }
@dudu:
老师好,注册Filter后,遇到了路径访问无效的问题,您遇到过么? 谢谢啦
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CheckLoginFilder());//注册自定义过滤器 filters.Add(new HandleErrorAttribute()); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); //ModelBinderProviders.BinderProviders.Add(new CheckLoginFilder()); //WebApiConfig.Register(GlobalConfiguration.Configuration); // FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RegisterGlobalFilters(GlobalFilters.Filters); //RouteConfig.RegisterRoutes(RouteTable.Routes); RegisterRoutes(RouteTable.Routes); }
报错:http://localhost:3593/Manage/Article/Index
1 [CheckLoginFilder] 2 public ActionResult Index() // GET: /Manage/Article/ 3 { 4 5 /*ArticleType=CopyRightDefine*/ 6 int articleType = String.IsNullOrEmpty(Request.QueryString["atid"]) ? (int)Utility.SpringHelper.ArticleType.CopyRightType : Convert.ToInt32(Request.QueryString["atid"]); 7 IList<Article> articleList = articleCompontent.GetByCategorId(articleType); 8 9 return View(articleList); 10 }
@dudu:
老师好,我找到网上的一篇帖子,http://blog.csdn.net/xyzqiang/article/details/7327119
也是有些问题,即使未登录,也会执行完Action后,再进行跳转。
@dudu:
(一)谢谢您的支持,我从园子里找到两个朋友的解决方法
(1) http://www.cnblogs.com/thomaseng/archive/2013/03/24/2979300.html
(2)http://www.cnblogs.com/happy-tears/archive/2012/07/30/2615247.html
(二)结合自己的逻辑,我整理了下:
1 public override void OnActionExecuting(ActionExecutingContext filterContext) 2 { 3 4 if (filterContext.Controller.ControllerContext.RequestContext.HttpContext.Session["UserLoginState"] == null) 5 { 6 string firstRquUrl = string.Empty; //记录未登录时访问的Url 7 if (filterContext.Controller.ControllerContext.RequestContext.HttpContext.Request.Url != null) 8 { 9 firstRquUrl = filterContext.Controller.ControllerContext.RequestContext.HttpContext.Request.Url.ToString(); 10 } 11 filterContext.Controller.ControllerContext.RequestContext.HttpContext.Session["RawUrl"] = firstRquUrl; 12 filterContext.Result = new RedirectResult("/Manage/User"); 13 14 #region 方法1 15 //filterContext.Controller.ControllerContext.RequestContext.HttpContext.Response.Redirect("/Manage/User"); 16 //filterContext.Result = new HttpNotFoundResult(); 17 #endregion 18 19 }// the end Session["UserLoginState"]==null 20 base.OnActionExecuting(filterContext); 21 }
(三)核心语句: filterContext.Result = new RedirectResult("/Manage/User");/*通过重定向到指定的 URI 来控制对应用程序操作的处理。*/
(四)目前的理解:
1 // 摘要: 2 // 通过重定向到指定的 URI 来控制对应用程序操作的处理。 3 public class RedirectResult : ActionResult 4 { 5 // 摘要: 6 // 初始化 System.Web.Mvc.RedirectResult 类的新实例。 7 // 8 // 参数: 9 // url: 10 // 目标 URL。 11 // 12 // 异常: 13 // System.ArgumentNullException: 14 // url 参数为 null。 15 public RedirectResult(string url); 16 }
追述到定义:
public class RedirectResult : ActionResult
1 //添加过滤器 2 [CheckLoginFilder] 3 public ActionResult Index() // GET: /Manage/Article/ 4 { 5 6 /*ArticleType=CopyRightDefine*/ 7 int articleType = String.IsNullOrEmpty(Request.QueryString["atid"]) ? (int)Utility.SpringHelper.ArticleType.CopyRightType : Convert.ToInt32(Request.QueryString["atid"]); 8 IList<Article> articleList = articleCompontent.GetByCategorId(articleType); 9 10 return View(articleList); 11 }
追述到定义:
public abstract class ActionResult
->>综上所述:继承的是一个父类ActionResult,可以利用父类中的方法..
(五)遗留的问题
1.Response.Redirect 和 new RedirectResult("")的实现原理和页面生命周期是否一样呢?
2.new HttpNotFoundResult() ,在生成环境中如何应用呀?
1 public override void OnActionExecuting(ActionExecutingContext filterContext) 2 { 3 4 if (filterContext.Controller.ControllerContext.RequestContext.HttpContext.Session["UserLoginState"] == null) 5 { 6 string firstRquUrl = string.Empty; //记录未登录时访问的Url 7 if (filterContext.Controller.ControllerContext.RequestContext.HttpContext.Request.Url != null) 8 { 9 firstRquUrl = filterContext.Controller.ControllerContext.RequestContext.HttpContext.Request.Url.ToString(); 10 } 11 filterContext.Controller.ControllerContext.RequestContext.HttpContext.Session["RawUrl"] = firstRquUrl; 12 filterContext.Result = new RedirectResult("/Manage/User"); 13 #region 方法1 14 //filterContext.Controller.ControllerContext.RequestContext.HttpContext.Response.Redirect("/Manage/User"); 15 //filterContext.Result = new HttpNotFoundResult(); 16 #endregion 17 18 }// the end Session["UserLoginState"]==null 19 base.OnActionExecuting(filterContext); 20 }
谢谢 @dudu,@thomaseng , @limo @开心的眼泪