JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题
项目的权限分配,采用的是RBAC的设计模式。后台配置权限的时候,需要获取到所有的权限因子。
不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的反射机制。
于是把PHP项目的经验带到JAVA项目中,发现PHP中的经验在java中,实现起来不是那么的方便。
这主要的原因:
一是语言上的特性导致权限控制方面的差异性。
二是项目使用的是SSH框架,action的名称已经使用注解替换了原有名称。使用反射获取到的类名和方法名组合,不是有效的权限因子(当然,解决方法还是反射)。
三是使用的是apache的shiro权限控制,自动注解型,判断是根据注解值来判断的。而经手过的PHP项目是本身控制权限无需事先绑定权限注解(语言特性差异、框架设计模式差异)。
问题就来了,如何拿到每一个方法上的权限注解呢?
代码如下:
/**
* 查找所有权限因子
*
* @author phpdragon
* @date 2014-12-24 下午9:53:49
* @param args
* @throws Exception
* @description :
* @return void
* @throws
*/
public Map<String, String> findAllRequiresPermissions() {
String packagePath = ServletActionContext.getServletContext()
.getRealPath("/");
packagePath += "/WEB-INF/classes/com/xxx/action/backManage"; String packageName = "com.xxx.action.manage";
List<Class<?>> classes = new ArrayList<Class<?>>(); Map<String, String> result = new HashMap<String, String>();
try {
classes = findAllClass(packageName, packagePath);
for (Class<?> clas : classes) {
Method[] methods = clas.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(RequiresPermissions.class)) {
String[] annotation_value = method.getAnnotation(
RequiresPermissions.class).value();
for (String val : annotation_value) {
result.put(val, val);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
} /**
* 查询某目录下所有类文件
*
* @author phpdragon
* @date 2014-12-24 下午9:56:33
* @param packageName
* @param packagePath
* @return
* @description :
* @return List<Class<?>>
* @throws
*/
private List<Class<?>> findAllClass(String packageName, String packagePath) {
List<Class<?>> classes = new ArrayList<Class<?>>();
try {
// 获取此包的目录 建立一个File
File dir = new File(packagePath);
// 如果不存在或者 也不是目录就直接返回
if (!dir.exists() || !dir.isDirectory()) {
return classes;
}
// 如果存在 就获取包下的所有文件 包括目录
File[] dirfiles = dir.listFiles();
// 循环所有文件
for (File file : dirfiles) {
// 如果是目录 则继续扫描
if (file.isDirectory()) { } else {
// 如果是java类文件 去掉后面的.class 只留下类名
String[] tmp = file.getName().split("\\.");
String file_type = tmp[tmp.length - 1].toLowerCase();
String className = file.getName().substring(0,
file.getName().length() - file_type.length() - 1);
try {
// 添加到集合中去
classes.add(Class
.forName(packageName + '.' + className));
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return classes;
}
好了,现在可以拿到有效的权限因子了,可以继续下面的权限分配工作了。
结论:
1.在现开发环境下的权限配置相比于经手过的PHP项目,权限因子需要手动配置并写死在配置文件或代码注解上。同样的功能,JAVA项目会相对复杂一些。
2.如果采用原始的serverlt开发方式,事先在调用action 和 method 前进行了权限判断集成的话,权限判断会简单很多。当然,在SSH框架中使用自定义的过滤器的话,以上都不是问题。
3.在SSH框架中实现权限控制方式很多种,以上所有结论只在当前开发环境下有效,如有出路,望斧正。
PS:
http://blog.csdn.net/jdzms23/article/details/17550119
http://www.cnblogs.com/mengdd/archive/2013/02/02/2890182.html
http://www.wl566.com/biancheng/152312.html
http://blog.csdn.net/justinavril/article/details/2873664
http://blog.csdn.net/bao19901210/article/details/17201173
http://blog.csdn.net/lfsf802/article/details/7392336
http://zhidao.baidu.com/link?url=bfmG-TjKbnw_OIcqgcYZ5jgMsWz9nNuXcC4CJAq6R6lyNp1ifUrVfbw-aBwJ6akIC2DABoRpbMmOxfLu1gYKRq
http://cuisuqiang.iteye.com/blog/1511887
JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题的更多相关文章
- 介绍下Java内存区域(运行时数据区)
介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...
- Java内存管理:Java内存区域 JVM运行时数据区
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...
- Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法
Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法 在用tomcat运行WEB项目,并且使用了StringUtils包的时候,会出现 jav ...
- 自定义注解之运行时注解(RetentionPolicy.RUNTIME)
对注解概念不了解的可以先看这个:Java注解基础概念总结 前面有提到注解按生命周期来划分可分为3类: 1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成clas ...
- Java 进阶巩固:什么是注解以及运行时注解的使用
这篇文章 2016年12月13日星期二 就写完了,当时想着等写完另外一篇关于自定义注解的一起发.结果没想到这一等就是半年多 - -. 有时候的确是这样啊,总想着等条件更好了再干,等准备完全了再开始,结 ...
- Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】
接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy 动态代理 Befor talking abou ...
- 【Java】关于JVM运行时内存空间、JVM垃圾回收机制
参考的优秀文章 <深入理解Java虚拟机 JVM高级特性与最佳实线>(机械工业出版社) Java虚拟机的堆.栈.堆栈如何去理解? 聊聊JVM的年轻代 前言 本文是<深入理解Java虚 ...
- Java基础之RTTI 运行时类型识别
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...
- Java虚拟机一:运行时数据区域
java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域.每个区域都有各自的用途,创建和销毁时间,按照<java虚拟机规范(Java SE 7 版)>的规定,虚拟机运行 ...
随机推荐
- UI设计,使用感知分层技术
页面设计时使用感知分层技术:不同的元素用不同的颜色表示,让它看起来是位于独立的一层之上.人们在无意识的状态下,只会感知到自己关注的元素,将其他元素排除在意识之外.
- 【C】——sigprocmask 阻塞进程信号
1.有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数.这种情况是通过阻塞信号实现的. 2.信号阻塞和忽略信号的区别. 阻塞的概念和忽略 ...
- windows10删除开始菜单中的xbox、人脉、邮件等应用
1.右键单击PowerShell,选择“以管理员身份运行” 2.输入下面的命令回车,会列出系统中所有已安装应用列表. Get-AppxPackage -AllUsers 从列表中找到你要卸载的应用,并 ...
- LibGDX skins
https://github.com/czyzby/gdx-skins ———————————————————————————————————————————— LibGDX comes with a ...
- HBase高性能复杂条件查询引擎
转自:http://blog.csdn.net/bluishglc/article/details/31799255 mark 写在前面 本文2014年7月份发表于InfoQ,HBase的PMC成员T ...
- 【转】【VS Code】配置文件Launch及快捷键
Ctrl+shift+p,然后输入launch,点击第一个选项即可配置. 之后选择More即可 具体配置可修改为: { "version": "0.2.0", ...
- 飞机找不到,流量哪去了?记一次移动WAP网关导致的问题
这几天随着客户端一个新版本发布,运维发现CDN的流量猛跌: 话说流量就是金钱,流量就是工资.领导很生气,后果很严重.没什么好说的,赶紧查!一开始怀疑服务端有问题,先受伤的总是我们,当然这也是没错的,因 ...
- Python property,属性
參考资料 http://www.ibm.com/developerworks/library/os-pythondescriptors/ 顾名思义,property用于生成一个属性.通过操作这个属性. ...
- php中对象(object)与数组(array)之间的相互转换
/** * 数组 转 对象 * * @param array $arr 数组 * @return object */ function array_to_object($arr) { if (gett ...
- jquery ajax 设置全局(常量和变量)
允许同源(相同域名不同端口)跨域配置: $.ajaxSetup({ xhrFields: { withCredentials: true } }); ajax所有的请求的全局设置: 此处为设置 自定义 ...