Struts,ZK 各实现细粒度的权限验证控制(下)
?
?? ?上篇,所说为什么要用Stringbuffer的拼接来存储权限集合,而不用List或者Map集合
?? 对于List或者Map ? List接口是对Collection进行了简单的扩充,它的泛化类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,存储对象会其元素顺序是按照加入顺序排列的,当如果循环存储,或者删除,都会进行排序,将对遍历的所有对象开辟N个空间,消耗占内存.Map是键值对是以哈希表的方式存储没有排序.但也消耗内存.具体的就不多讲了. ??
?? Stringbuffer 和string的拼接 ?又有性能上的差异,String 虽然是final类,String是原型类型,类似基本类型,就是说, 对他的修改都会创建一个新的对象,例如String s ="abc"; 修改String s="abc"+"c"
对象"abc" 与"abc"+"c"不是同一个对象,String字符串的拼接一般会重复创建string对象,StringBuffer与StringBuilder这两个类是为字符串设计的,后者是一个线程安全的类,
设计这两个类就是解决string反复创建新对象的问题,为什么StringBuffer一般效率高于String,是因为StringBuffer是一个Buffer,有一个字符缓冲数组,默认分配16个字符.
??? 所以选用StringBuffer来存储权限集合对象.
?
package com.linktel.linkFax.web.zk.util;import java.util.List;import org.zkoss.zkplus.spring.SpringUtil;import com.linktel.linkFax.LinkFaxContext;import com.linktel.linkFax.domain.Authority;import com.linktel.linkFax.domain.Resource;import com.linktel.linkFax.domain.Role;import com.linktel.linkFax.domain.User;import com.linktel.linkFax.service.ResourceService;public class AuthorityTools {/** * 通过资源名称查找功能权限 与登录用户所属角色所拥有的权限对比, 如果功能权限被授权的话返回授权; * * @param resourceName * 功能资源名称; * @return */public static boolean hasPermission(String resourceName) {StringBuffer authoritiesStr=(StringBuffer ) ZkUtils.getSessionAttr(LinkFaxContext.CURRENT_AUTHORITIESSTR);ResourceService service = (ResourceService) SpringUtil.getBean("resourceService");Resource resource = service.getResourceByValue(resourceName);List<Authority> authoritiesResource = resource.getAuths();for (Authority authority : authoritiesResource) {int index = authoritiesStr.indexOf(authority.getName());if (index >= 0) {return Boolean.TRUE;}}return Boolean.FALSE;}}
?
??以上内容是自己写了一个可重用的工具类,这个工具类是针对于循环遍历所操作的resource资源来验证当前登录的用户是否是有权限,如有权限就返回true ? ?如没有就返回false
?
?? 具体实现是这样的 ?之前我们把所有角色的权限放入了StringBuffer中 ?现在我们只要通过当前用户操作的resource资源
中的所包含的权限名称去比对角色中的权限名称
?? ? authoritiesStr.indexOf(authority.getName());
?
?接下来就是在页面初始化的时候去绑定后台类对象
?? ? ??
<?xml version="1.0" encoding="utf-8"?><?page id="userPage"?><?xel-method prefix="c" name="hasPermission" signature="com.linktel.linkFax.web.zk.util.AuthorityTools hasPermission(java.lang.String)"?><?init root="./userWin"?><window id="userWin" width="100%">
<div if="${c:hasPermission('CompanyUser')}"><label value="按公司条件查询:"></label><combobox id="cbxCompany" model="@{userWin.companyList}"selectedItem="@{userWin.company}" readonly="true"><comboitem self="@{each=company}" label="@{company.name}"></comboitem></combobox></div><separator width="260px" bar="true"></separator><div if="${c:hasPermission('DeptUser')}"><label value="按部门条件查询:"></label><combobox id="cbxDept" model="@{userWin.deptList}"readonly="true" selectedItem="@{userWin.dept}"><comboitem self="@{each=dept}" label="@{dept.name}"></comboitem></combobox></div>
</window>
?
??<?xel-method prefix="c" name="hasPermission"?
class="com.linktel.linkFax.web.zk.util.AuthorityTools"?
signature="com.linktel.linkFax.web.zk.util.AuthorityTools ?hasPermission(java.lang.String)"?>
绑定后台类的指令
?
?? ?<div if="${c:hasPermission('CompanyUser')}"> ?
?? ?if(${c:hasPermission('资源名称')}) 如果之前后台方法返回的是true ?那么在加载的时候组件被创建,如果是false就 ?不被创建
?
?
?