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 ...
随机推荐
- BZOJ2981 : [Poi2002]括号
对于最终加入了括号的序列,对其求中缀表达式,建树. 可以发现$n-1$个运算符DFS序递增,且若一个-上方往左走了奇数次,则它就是+,否则就是-. 所以考虑DP,设$f[i][j]$表示考虑了前$i$ ...
- C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序
借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...
- Vijos1448校门外的树 题解
Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...
- linux修改系统编码
Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.一种方法是在windows进行转码,比如使用ue工具在文件-->转换 ...
- C# 委托和Lambda---基础
[委托]是一个类可以把一个方法当作另一个方法的参数使用. 声明委托:delegate string 委托名(参数列表);//跟定义方法一样,只是没有方法体,必须使用关键字delegate使用委托的函数 ...
- 关于多线程情况下Net-SNMP v3 版本导致进程假死情况的跟踪与分析
1.问题描述 在使用net-snmp对交换机进行扫描的时候经常会出现进程假死的情况(就是进程并没有死掉,但是看不到它与外界进行任何的数据交互).这时候不知道进程内部发生了什么,虽然有日志信息,但进程已 ...
- JS中注意事项
(一)判断中注意事项 一.所有的相对路径都别拿来做判断 1.img src='...' 2.href='1.css', href='html/index.html' 3.img src='http:/ ...
- 关于mysql(或MariaDB)中的用户账号格式
之前在修改数据库本地root用户密码时,发现我远程连接的root用户的密码并没有改变,之后查了一下,发现原来这两个root不是同一个用户(汗..) 于是联想到之前配置数据库每次给用户赋予远程连接权限时 ...
- H5学习小结——div+css创建电子商务静态网页
使用Sublime Text软件编写电子商务类网站静态形式首页 经过差不多一星期的学习,基本掌握了div+css的用法之后,开始了实战练习.首先要做的就是要练习一下一般电子商务网页的编写,我做的是下图 ...
- Server Error in '/' Application
在服务器部署了网站,然后访问的时候出现异常 Server Error in '/' Application,一般这样的异常都是不明确的,我们应当把网站根目录web.config<custom ...