目前要使用MVC过滤器来校验用户是否登录以及实现一些简单权限控制的功能。参照网上的资料重写了ActionFilterAttribute类里面的OnActionExecuting方法,说是在Action执行之前会先执行该方法。代码:
pre class=”brush: csharp”>
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”);
}
}
}
}
/pre>
目前的问题是,虽然在执行每个加过过滤器的Action之前会执行OnActionExecuting方法,但是执行完OnActionExecuting之后,Action也会被执行。比如这里:
pre class=”brush: csharp”>
[AuthorizeFilter]
public bool ChangeState(string type,string id, int state)
{
return _bll.ChangeState(type,id, state);
}
/pre>
AuthorizeFilter过滤器判断操作人是没有权限执行ChangeState的,但是判断完之后它却直接走到ChangeState方法里面去了,即使在在过滤器里跳转了也没用。这是怎么回事,是跳转方式有问题还是过滤器其他地方未完善的原因?还有,如果没有权限的话直接在当前页面弹窗提示而不是跳转页面又该怎么实现呢?