Attribute注解(用于判断权限)
一 Attribute原理:
Attribute注解,是附加上方法、属性、类等上面的标签,
可以通过方法的GetCustomAttribute获得粘贴的这个Attribute对象
通过反射调用到粘贴到属性、方法、类等等的对象
任务:改造ORM
ORM约定:类得名字与表的名字一样,主键必须是Id,
改造一下ORM(类名还可以和表名不一样,Id可以与主键不一样)
//在sayHello方法的描述信息MethodInfo上粘了一个RupengAttribute对象
//注解的值必须是常量,不能是动态算出来的 [RupengAttribute(Name=DateTime.Now.ToString())]
//[RupengAttribute(Name="rupengwnag")]
//一般特性Attribute的类名都以Attribute结尾,这样用的时候就不用谢"Attribute"了
二 Attribute步骤:
1 Attribute本身类
2 标记了Attribute的类
3 通过找到这个类的Attribute标记,从而先去执行上面的Attribute类
三 Attribute示例:
//testAttribute.csProj
namespace testAttribute
{
class Program
{
static void Main(string[] args)
{
Type type = typeof(Person);
//1 获得SayHello()上的Attribute注解对象
object[] objs = type.GetMethod("SayHello").GetCustomAttributes(typeof(AlibabaAttribute), true);
foreach(object obj in objs)
{
AlibabaAttribute ali = obj as AlibabaAttribute;
Console.WriteLine(ali.Name);
} //2 在类中的方法中找到Obsolete注解对象
MethodInfo[] methods = type.GetMethods();
foreach(MethodInfo method in methods)
{
Object[] obsols = method.GetCustomAttributes(typeof(ObsoleteAttribute),true);
if (obsols.Length>)
{
ObsoleteAttribute obsol = obsols[] as ObsoleteAttribute;
Console.WriteLine("不能执行该方法:" + obsol.Message);
}
} //3 获得Love()的Attribute注解对象
object[] objtens = type.GetMethod("Love").GetCustomAttributes(typeof(TengxunAttribute), true);
foreach (object obj in objtens)
{
TengxunAttribute ten = obj as TengxunAttribute;
Console.WriteLine(ten.Name);
} Console.ReadKey();
}
} class Person
{
[Alibaba(Name="阿里人是幸福的")]
public void SayHello()
{
} [Obsolete("这个方法已过时,禁止访问")]
public void F1()
{
} [Tengxun(Name = "腾讯是我的最爱")]
public void Love()
{
}
} //
[AttributeUsage(AttributeTargets.Method)]
class AlibabaAttribute : Attribute
{
public AlibabaAttribute() { }
public AlibabaAttribute(string name)
{
this.Name = name;
}
public string Name { get; set; }
} //
class TengxunAttribute : Attribute
{
public string Name { get; set; }
}
}
四 Attribute应用:
当执行某个action方法时,先获得Attribute对象,用于检查权限
//PermissionActionAttribute.cs
/// <summary>
/// 权限动作的 Attribute注解
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class PermissionActionAttribute:Attribute
{
public string Name { get; set; }
public PermissionActionAttribute(string name)
{
this.Name = name;
}
}
//BaseController.cs
public class BaseController : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//需要约定方法:public void list(HttpContext context) //方法名和action一致
#region 检查用户是否登录
LoginHelper.CheckHasLogin(context);
#endregion
string action = context.Request["action"];
if(action==null)
{
throw new Exception("未找到action:"+action);
}
Type type = this.GetType(); //this是被new的对象,即子类CategoryController等
//try
//{
MethodInfo method = type.GetMethod(action);
#region /获得该action的 Attribute注解对象
//获得action该方法的 Attribute注解对象(注解对象的Name属性就是权限的名称,用于判断权限)
object[] objAttrs = method.GetCustomAttributes(typeof(PermissionActionAttribute), true);
if (objAttrs.Length > )
{
PermissionActionAttribute paa = objAttrs[] as PermissionActionAttribute;
AdminHelper.CheckHasPower(context, paa.Name);
}
#endregion
method.Invoke(this, new object[] { context }); //调用this对象的method方法 (参数列表是object[],其中一个参数是context)
//}
//catch(Exception ex) //如果找不到这个action方法,就说明这个action是错误的/不存在的
//{
// throw new Exception("未知的action:"+action);
//}
} public bool IsReusable
{
get
{
return true;
}
}
}
//CourseController.cs
[PermissionAction("新增课程")]
public void addnew(HttpContext context)
{
#region 新增展示
string categoryidStr = context.Request["categoryid"];
int categoryid = VolidHelper.CheckStrToInt(categoryidStr);
TD_COURSE course = new TD_COURSE();
course.VIDEOCATEGORYID = categoryid;
RazorHelper.RazorParse(context, "~/Course/CourseAlter.cshtml", new { action = "addnew", course = course });
#endregion
}
Attribute注解(用于判断权限)的更多相关文章
- Shiro入门之二 --------基于注解方式的权限控制与Ehcache缓存
一 基于注解方式的权限控制 首先, 在spring配置文件applicationContext.xml中配置自动代理和切面 <!-- 8配置自动代理 --> <bean cl ...
- springboot + 拦截器 + 注解 实现自定义权限验证
springboot + 拦截器 + 注解 实现自定义权限验证最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定义 ...
- 「踩坑记」Android API 判断权限申请结果的闪退问题
这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...
- Assertor用于判断参数和抛出异常
代码 /// <summary> 断言器,用于判断和抛出异常 /// </summary> static class Assertor { /// <summary> ...
- stop() 是用于停止动画 :animated 用于判断动画是否在进行中
stop() 是用于停止动画 if($("element").is(":animated")) 用于判断动画是否在进行中
- JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内
/* *JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内 *@param date1 date2(形如:'2015-01-01'类 ...
- Attribute注解
class Program { static void Main(string[] args) { //Attribute注解,Attribute是附加到方法.属性.类等上面的特殊的标签,在类Type ...
- obj.getClass() == Person.class 用于判断类型
obj.getClass() == Person.class 用于判断类型
- 一个diff工具,用于判断两个目录下所有的改动(比较新旧版本文件夹)
需求: 编写一个diff工具,用于判断两个目录下所有的改动 详细介绍: 有A和B两个目录,目录所在位置及层级均不确定 需要以B为基准找出两个目录中所有有改动的文件(文件或内容增加.修改.删除),将有改 ...
随机推荐
- 七 、linux正则表达式
为处理大量的字符串而定义的一套规则和方法 1)linux正则表达式以行为单位处理 2)alians grep = “grep –color=auto”,让匹配的内容显示颜色 3)注意字符集,expor ...
- linux下的cacti安装(centos7)
1 cacti运行环境准备 cacti需要php+apache+mysql+snmp+RRDTool,以及cacti本身.cacti本体是用php开发的网站,通过snmp对远端设备信息进行采集.apa ...
- HttpClient技术
1.什么是HttpClient? 2.HttpClient特点? 特点: 2.1. 基于标准.纯净的Java语言.实现了Http1.0和Http1.1 2.2. 以可扩展的面向对象的结构实现了Http ...
- android.intent.category.LAUNCHER和android.intent.action.MAIN
一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢? 有些程序可能需要显示在程序列表里,有些不需要.怎么定义呢? android. ...
- java基础(2)-面向对象(1)
面向对象 面向对象思想 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程:强调的是功能行为 面向对象:将功能封装进对象,强调具备了功能的对象 面向对象是基于面向过程的 面向对象举例 ...
- Kafka详解三:开发Kafka应用
问题导读 1.Kafka系统由什么组成?2.Kafka中和producer相关的API是什么? 一.整体看一下Kafka 我们知道,Kafka系统有三大组件:Producer.Consu ...
- codeforces 705A:Hulk
Description Dr. Bruce Banner hates his enemies (like others don't). As we all know, he can barely ta ...
- Qt5.3.2_vs10_发布时所需DLL的路径
1. ???\Qt5.3.2_vs2010\5.3\msvc2010_opengl\bin 2.
- CEF3.2623使用记录:windows编译
CEF3.2623使用记录:windows编译 1:cef3.2623下载地址 2623是cef3最后一个支持xp系统的版本,且可以支持html的audio标签,可以用作对html音频的处理下载地址为 ...
- img标签显示本地文件
html: <img src="__IMG__/male.png" id="imgfpic1" style="height: 100%; wid ...