C# mvc中为Controller或Action添加定制特性实现登录验证
在本文开始前,先简单讲两个知识点:
1.每个action执行前都会先执行OnActionExecuting方法;
2.FCL提供了多种方式来检测特性的存在,比如IsDefined、GetCustomAttributes方法等,IsDefined方法仅仅是判断目标有没有应用指定特性,而GetCustomAttributes方法会构造指定特性的新实例。
一、下面先利用OnActionExecuting和IsDefined这两个方法实现判断action是否需要登录
1.新建mvc项目,实现定制特性CheckLogin,如下:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false)]
public sealed class CheckLogin : Attribute
{
//什么都无需写
}
2.新建控制器,命名“ParentController”(以后新建的控制器都继承它),重写OnActionExecuting方法,如下:
public class ParentController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
//判断action是否有CheckLogin特性
bool isNeedLogin = filterContext.ActionDescriptor.IsDefined(typeof(CheckLogin), false); if (isNeedLogin)
{
if (!IsLogin())
{
//如果没有登录,则跳至登陆页
filterContext.Result = Redirect("/User/Login");
}
}
} protected bool IsLogin()
{
if (Session["UserInfo"] != null)
return true; return false;
}
}
3.新建控制器“HomeController”,继承“ParentController”,如下
public class HomeController : ParentController
{ public ActionResult Index()
{
return View();
}
[CheckLogin]
public ActionResult About()
{
return View();
}
}
在“HomeController”内,执行Index方法无需登录验证,执行About方法前需要登录验证。简单的判断action登录验证的功能就ok了。
思考:
对于上面的功能,如果特性CheckLogin应用在控制器(Controller)上,那么该控制器内的所有action都需登录验证(当然OnActionExecuting方法内需加判断控制器是否有特性的代码),这样不必为每个action加[CheckLogin]了。
但是,这里会有一个问题:如果控制器加了特性CheckLogin,并且该控制器下有100个action,只有一个或几个action无需登录登录验证,那么上面的功能就显得不够灵活了。
解决方法是,为特性CheckLogin加一个属性,来表明是否需要登录验证,
二、下面利用OnActionExecuting和GetCustomAttributes这两个方法实现判断action是否需要登录
1.修改定制特性CheckLogin,如下:
public sealed class CheckLogin : Attribute
{
public bool IsNeedLogin = false; public CheckLogin (bool isNeed)
{
this.IsNeedLogin = isNeed;
}
}
IsNeedLogin=true表示需要登录验证,IsNeedLogin=false无需。
2.修改ParentController控制器,如下:
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext); bool result = false; //controller上是否有特性CheckLogin,以及特性的IsNeedLogin值
var controllerAttrs = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(CheckLogin), false);
if (controllerAttrs.Count() > )
{
var conAttr = controllerAttrs[] as CheckLogin;
if (conAttr != null)
{
if (conAttr.IsNeedLogin)
result = true;
else
result = false;
}
} //action上是否有特性CheckLogin,以及特性的IsNeedLogin值
var actionAttrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(CheckLogin), false);
if (actionAttrs.Count() > )
{
var attr = actionAttrs[] as CheckLogin;
if (attr != null)
{
if (attr.IsNeedLogin)
result = true;
else
result = false;
}
} if (!IsLogin() && result)
{
//如果没有登录,则跳至登陆页
filterContext.Result = Redirect("/User/Login");
}
} protected bool IsLogin()
{
if (Session["UserInfo"] != null)
return true; return false;
}
}
3.修改HomeController,如下:
[CheckLogin(true)]
public class HomeController : ParentController
{
[CheckLogin(false)]
public ActionResult Index()
{
return View();
} public ActionResult About()
{
return View();
}
}
代码写到这,就可以更灵活为controller或action添加特性,表示是否需要登录验证。
C# mvc中为Controller或Action添加定制特性实现登录验证的更多相关文章
- asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证
前言:最近在倒腾 微软的新平台 asp.net Core 2.0,在这个过程中有些东西还是存在差异.下面是我在学习过程的一点笔记.有不妥之处,望各位大虾指正! 一.先创建一个控制器继承于Control ...
- SSM框架中,controller的action返回参数给vue.js
在SSM框架中,controller的action中,返回的是视图,即jsp页面或是ModelAndView,若是通过axios给vue传值的话,需要转换为字符串或是user实体类对象. 使用@Res ...
- [转]ASP.NET MVC中的两个Action之间值的传递--TempData
本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...
- MVC中从Controller像View层传值
MVC中的Controller不能直接的訪问View层中的控件,那么是怎样的将Controller中值传到View中,经常使用的有4种 ViewData: 是获取或设置视图的字典对象,它里面存放的是键 ...
- MVC中的Controller
Controller是MVC模式中的三个核心元素之一. MVC模式中的Controller主要负责响应用户的输入, 并在响应时修改Model. MVC提供的是方法调用的结果, 而不是动态生成的页面. ...
- Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法
Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx" ...
- 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action
目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...
- ASP.NET Core MVC 中的 [Controller] 和 [NonController]
前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...
- ASP.NET MVC中的两个Action之间值的传递--TempData
一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictiona ...
随机推荐
- ural 2071. Juice Cocktails
2071. Juice Cocktails Time limit: 1.0 secondMemory limit: 64 MB Once n Denchiks come to the bar and ...
- [linux]ubuntu 下安装RMySQL包
http://downloads.mysql.com/docs/connector-odbc-en.pdf http://blog.csdn.net/ixidof/article/details/59 ...
- 你可能不再需要Underscore
过去几年像 Underscore 和 lodash 等库进入许多JavaScript程序员的工具函数中.虽然这些工具库可以使你的代码写起来更容易,但是他们不一定使代码更简单或更容易理解. 各种工具函数 ...
- 桌面每日一句--桌面翻译工具(有道翻译,微软翻译,Google翻译)
现在的翻译软件功能越来越多,也越来越臃肿,还不时弹广告,真的很烦恼. 鉴于这种情况,自己做了个翻译软件,能满足日常需求就好了.需要用的时候可以直接在桌面输入单词翻译,或者直接使用快捷键呼出翻译窗口.最 ...
- 用clip剪裁实现半圆
定义和用法 clip 属性剪裁绝对定位元素. 说明 这个属性用于定义一个剪裁矩形.对于一个绝对定义元素,在这个矩形内的内容才可见.出了这个剪裁区域的内容会根据 overflow 的值来处理.剪裁区域可 ...
- 卸载VS2012
- ado.net 属性扩展 综合练习
实现数据查询,添加,删除,修改各项功能 业务逻辑层: using System; using System.Collections.Generic; using System.Linq; using ...
- 格式与布局 CSS阴影效果(Box-shadow)用法
一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. 二.position:absolute 1.外层没有position:absolute(或relat ...
- sublime text 3 package control
使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: import urllib.request,os; pf = 'Package Control. ...
- sql2008 r2 重新启动 失败解决办法
一.问题描述: 在计算机中安装sql_server_2008_R2,安装前执行检查时,提示重启计算机失败.重启计算机后,再执行检查仍然提示这个错误. 二.解决方案: 1.在开始->运行中输入re ...