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为基准找出两个目录中所有有改动的文件(文件或内容增加.修改.删除),将有改 ...
随机推荐
- HTML如何禁止文本框输入
禁止文本框输入有以下两种方法: 1,设置input为只读状态,代码如下: <input readonly="readonly" value="test1" ...
- debian下使用dynamic printk分析usb网卡驱动
在<debian下使用dynamic printk分析usb转串口驱动执行流程>中使用了usb转串口,当前例子使用usb网卡分析驱动(dm9601芯片). 仍然需要使能dynamic pr ...
- explicit c++
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...
- 1.linux源码安装nginx
从官网下载nginx.tar.gz源码包 拷贝至Linux系统下进行解压 tar -zxvf nginx.tar.gz 进入解压后的目录,需要./configure,此步骤会报多个错,比如没有安装gc ...
- eclipse设置高亮显示的颜色
设置高亮显示的颜色:Window-->preferences-->General-->Editors-->Text Editors-->Annotations--> ...
- 什么是OOM?如何解决OOM问题!
1.什么是OOM? 程序申请内存过大,虚拟机无法满足我们,然后自杀了.这个现象通常出现在大图片的APP开发,或者需要用到很多图片的时候.通俗来讲就是我们的APP需要申请一块内存来存放图片的时候,系统认 ...
- mysql中两表更新时产生的奇葩问题,产生死锁!
如下一个两表更新语句 UPDATE hzxm201610 a,xmhzylb1201610 b SET a.gk07_1_6=b.gk04_11,a.gk07_2_6=b.f06_1,a.gk07_3 ...
- YARN作业提交流程剖析
YARN(MapReduce2) Yet Another Resource Negotiator / YARN Application Resource Negotiator对于节点数超出4000的大 ...
- Spring初学之annotation实现AOP前置通知、后置通知、返回通知、异常通知。
实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...
- 爬虫之解析库-----re、beautifulsoup、pyquery
一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...