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为基准找出两个目录中所有有改动的文件(文件或内容增加.修改.删除),将有改 ...
随机推荐
- windows环境下安装部署并启用zkui的web图形界面
在此之前的工作:不是本机部署的三个服务器最为伪集群的zookeeper环境,并将三个为服务启动起来. 然后才有了下面的工作. 1. 首先,zkui项目地址:https://github.com/Dee ...
- spring mvc 对象型参数的传递(遇到坑了)
直接来个列子: 这里设置了,contenType="application/json" 这里post 接收的参数对象. 但是问题来了: <html> <head& ...
- json数据与Gson工具类的使用
JS中使用JSON JSON对象 --> JSON字符串:JSON.stringify(对象) JSON字符串 --> JSON对象:JSON.parse(JSON字符串) <scr ...
- Oracle给不同组数据添加顺序
SELECT DENSE_RANK() OVER(ORDER BY TABLESPACE_NAME),T.* FROM USER_TABLES T;
- IntelliJ Idea 免费激活方法免激活码
1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...
- Installing StackTach
为StackTach创建database,默认使用MySql,也可以 在settings.py 文件中配置其他的. create stack db mysql -u root -p mysql> ...
- http://www.cnblogs.com/jscode/archive/2012/09/03/2669299.html
http://www.cnblogs.com/jscode/archive/2012/09/03/2669299.html
- Redis作为缓存:实战自我总结(转载)
转载:[http://www.tuicool.com/articles/zayY7v] redis缓存服务器笔记 redis是一个高性能的key-value存储系统,能够作为缓存框架和队列.但是由 ...
- 使用 docker 拉取镜像和创建容器-nginx
本文主要分享通过从docker hub上获取nginx镜像 1.首先查找nginx镜像 [root@node1 ~]# docker search nginx NAME DESCRIPTION ST ...
- for...else: 一个程序引发的陷阱
python3菜鸟教程有一段关于for循环和else搭配的代码: for n in range(2, 10): for x in range(2, n): if n % x == 0: print(n ...