关于MVC过滤器的问题

我目前要使用MVC过滤器来校验用户是否登录以及实现一些简单权限控制的功能。参照网上的资料重写了ActionFilterAttribute类里面的OnActionExecuting方法,说是在Action执行之前会先执行该方法。各位先看一下代码:

public class AuthorizeFilter : ActionFilterAttribute
{
//Action方法执行之前执行此方法
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.RouteData.Values["controller"].ToString().Contains("Login"))return;
base.OnActionExecuting(filterContext);

//校验用户是否已经登录
if (UserCookie.UserId == null || UserCookie.UserName == null)
{ //跳转到登陆页
filterContext.HttpContext.Response.Redirect("/Login/LoginIndex");

}
else
{

string conName = filterContext.RouteData.Values["controller"].ToString();
if (conName.Contains("Home")) return;
string actName = filterContext.RouteData.Values["action"].ToString();
LoginBLL _bll = new LoginBLL();
if(!_bll.GetPermission(UserCookie.UserId,conName,actName))//判断用户是否有权限执行Action
{
return;
//filterContext.HttpContext.Response.Redirect("~/Login/ErroPage");
}

}

}
}


目前的问题是,虽然在执行每个加过过滤器的Action之前会执行OnActionExecuting方法,但是执行完OnActionExecuting之后,Action也会被执行。比如这里:

[AuthorizeFilter]
public bool ChangeState(string type,string id, int state)
{
return _bll.ChangeState(type,id, state);
}

AuthorizeFilter过滤器判断操作人是没有权限执行ChangeState的,但是判断完之后它却直接走到ChangeState方法里面去了,即使在在过滤器里跳转了也没用。这是怎么回事,是跳转方式有问题还是过滤器其他地方未完善的原因?还有,如果没有权限的话直接在当前页面弹窗提示而不是跳转页面又该怎么实现呢?本人初学MVC,还望各位前辈们能指点一二,谢谢!
...全文
163 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 8 楼 lc2737 的回复:
base.OnActionExecuting(filterContext); 这句放在判断里面去,你前面就已经执行方法,当然不行。
谢谢这位大神的提点,一语惊醒梦中人哪。也谢谢其他各位的回答!
ajaxfeifei 2015-01-16
  • 打赏
  • 举报
回复
引用 7 楼 u013324517 的回复:
[quote=引用 6 楼 starfd 的回复:] 你应该是要RedirectView吧?
不是的,我是想弄成弹窗的模式,而不是跳转。毕竟点一个按钮没有权限就跳转页面体验不大好。[/quote] 如果你要弹窗模式那就要使用ajax才行,否则弹不了,使用Ajax模式,然后在

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
        //Action方法执行之前执行此方法       
private bool canexcute=false;
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.RouteData.Values["controller"].ToString().Contains("Login"))return;
            base.OnActionExecuting(filterContext);
 
            //校验用户是否已经登录           
            if (UserCookie.UserId == null || UserCookie.UserName == null)
            {   //跳转到登陆页    
                filterContext.HttpContext.Response.Redirect("/Login/LoginIndex");
 
            }
            else
            {
                
                string conName = filterContext.RouteData.Values["controller"].ToString();
                if (conName.Contains("Home")) return;
                string actName = filterContext.RouteData.Values["action"].ToString();
                LoginBLL _bll = new LoginBLL();
                if(!_bll.GetPermission(UserCookie.UserId,conName,actName))//判断用户是否有权限执行Action
                {
                   canexcute=false;
                }
else
{
canexcute=true;
}
 
            }
 
        }
            base.OnAuthorization(filterContext);
        }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
          //测试用
return canexcute;
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            var manager=new AuthorizationManager("");
            var messageAll = HtmlControlEx.GetLanguage("NoAuthorization").Replace("{0}",manager.GetActionName(_controllerName, _actionName));
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var result = new BasePageResult(-5);
                result.Message = messageAll;
                filterContext.Result = new JsonResult { Data=result};//这里返回Json格式的内容,前台js配合判断
            }
            else
            {
                var message = new HandlerPageError(new Exception(messageAll), this._controllerName, _actionName);
                filterContext.Result=new ViewResult
                {
                    ViewName = "~/Views/Shared/ShowMessage.cshtml",
                    ViewData = new ViewDataDictionary<HandlerPageError>(message),
                    TempData = filterContext.Controller.TempData
                };
            }
        }

  • 打赏
  • 举报
回复
引用 7 楼 u013324517 的回复:
[quote=引用 6 楼 starfd 的回复:] 你应该是要RedirectView吧?
不是的,我是想弄成弹窗的模式,而不是跳转。毕竟点一个按钮没有权限就跳转页面体验不大好。[/quote] 弹窗是js的事情了啊,亲,那你可以直接返回一个Response,包含特定的标志头的,然后你的js监控这个Response头,有这个标志头的就弹个窗呗
ajaxfeifei 2015-01-16
  • 打赏
  • 举报
回复
base.OnActionExecuting(filterContext); 这句放在判断里面去,你前面就已经执行方法,当然不行。
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
你应该是要RedirectView吧?
不是的,我是想弄成弹窗的模式,而不是跳转。毕竟点一个按钮没有权限就跳转页面体验不大好。
  • 打赏
  • 举报
回复
你应该是要RedirectView吧?
  • 打赏
  • 举报
回复
引用 3 楼 x556549 的回复:
[quote=引用 1 楼 u013324517 的回复:] 求大神帮忙..
如果想要action不执行的话,需要你的else里面没有跳转 也就是缺少这一句 filterContext.HttpContext.Response.Redirect("你想要跳转的地方"); 如果整个过滤器都判断完,还没有这句话,系统就会执行action[/quote] 不是啊,我一开始就是写这句的。但是它跳转了也执行了Action,所以我把那句注释了写别的试试的。并不是缺少这一句
x556549 2015-01-16
  • 打赏
  • 举报
回复
弹框提示的话直接在方法内判断用户是否已经登录就行了,用过滤器反而麻烦
x556549 2015-01-16
  • 打赏
  • 举报
回复
引用 1 楼 u013324517 的回复:
求大神帮忙..
如果想要action不执行的话,需要你的else里面没有跳转 也就是缺少这一句 filterContext.HttpContext.Response.Redirect("你想要跳转的地方"); 如果整个过滤器都判断完,还没有这句话,系统就会执行action
  • 打赏
  • 举报
回复
自己顶...
  • 打赏
  • 举报
回复
求大神帮忙..
[ 2021年,将Spring全家桶的课程进行Review,确保不再有顺序错乱等问题导致学员看不懂内容,进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并开始逐步增加高阶的Spring Security等内容,课件将逐步进行上传,敬请期待! ]本课程是Spring全家桶案例精讲课程的第二部分Spring MVC,Spring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Java Spring的Web知识点,主要是关于Spring MVC的应用,包含:表单的增删改查、国际化、过滤器、拦截器、日志Log4j2及slf4j的使用、主题更改网站皮肤及样式、文件上传等的案例讲解,并且最后以一个SSM(Spring+Spring MVC+Mybatis)贯穿前后台的案例作为Spring MVC课程的终奖, 从而使大家快速掌握Spring的基础核心知识,快速上手,为面试、工作等做好充足准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。 【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验 【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧