首页 新闻 会员 周边 捐助

基于MVC的CheckLoginFilder

0
悬赏园豆:10 [已解决问题] 解决于 2014-11-17 19:25

大家好:有个问题想问问大家)

(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")视图。

大家有实现过相关的逻辑么,怎样在添加过滤器后,不访问视图,直接跳转回登录页。

  

因为豆子确实不多,谢谢大家:)

Frank铭的主页 Frank铭 | 初学一级 | 园豆:8
提问于:2014-11-12 12:13
< >
分享
最佳答案
0

在Global.asax.cs的Application_Start中注册CheckLoginFilder这个Filter了吗?

收获园豆:10
dudu | 高人七级 |园豆:30736 | 2014-11-12 13:57
 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铭 | 园豆:8 (初学一级) | 2014-11-12 22:11

@Frank铭: 

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {   
            filters.Add(new CheckLoginFilder());
        }
dudu | 园豆:30736 (高人七级) | 2014-11-12 22:19

@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         }
Frank铭 | 园豆:8 (初学一级) | 2014-11-13 16:35

@dudu: 

  老师好,我找到网上的一篇帖子,http://blog.csdn.net/xyzqiang/article/details/7327119

也是有些问题,即使未登录,也会执行完Action后,再进行跳转。

Frank铭 | 园豆:8 (初学一级) | 2014-11-13 17:03

@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    }
View Code

 追述到定义:

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         }
View Code

追述到定义:

public abstract class ActionResult

 

->>综上所述:继承的是一个父类ActionResult,可以利用父类中的方法..

 (五)遗留的问题

      1.Response.Redirect 和 new RedirectResult("")的实现原理和页面生命周期是否一样呢?

      2.new HttpNotFoundResult() ,在生成环境中如何应用呀?

 

 

Frank铭 | 园豆:8 (初学一级) | 2014-11-17 19:15
其他回答(1)
1
 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 @开心的眼泪

Frank铭 | 园豆:8 (初学一级) | 2014-11-17 19:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册