采用BigInteger进行的权限设计

设计技巧

2016-09-14

103

3

最近看到了一个项目的权限是根据bigineger来进行计算的菜单权限,觉得还是不错,存储上只需要存储在一个字段里就可以了,通过计算算出该角色的菜单权限即可,效率也非常的快,放在session中也非常的小,下面简单说一下思路。

        首先,将界面中选好的菜单树,勾选完成后传到后台,后台通过转成字符串数组来进行设值    

 public static BigInteger sumRights(String[] rights){  

        BigInteger num = new BigInteger("0");  
        for(int i=0; i<rights.length; i++){  
            num = num.setBit(Integer.parseInt(rights[i]));  
        }  
        return num;  
    }

通过上面方法,返回一个BigInteger,然后将这个数字存入所属角色的菜单权限字段中。注意的是:这里的菜单ID必须是数字,String[] rights为所选菜单的数组,通过setbit方法一一设置进num中。

 

 

其奖,再获取权限的时候,也一样,通过把之前存入的菜单权限的biginteger和菜单ID做对比来判断是否具有该菜单权限

 public static boolean testRights(BigInteger sum,int targetRights){  

       return sum.testBit(targetRights);  

   }  


sum为对应角色的菜单权限值,targetRights为具体菜单ID,通过biginteger的testBit方法来判断是否存在里面,如果存在就返回true,不存在就返回false.

 

biginteger通过set的值,其实是2的权的和。下面有一个列子:

package com.hundsun.network.post.settle.job;
import java.math.BigInteger;
public class TestBigInteger {
    public static void main(String[] args) {
    //初始
    BigInteger num = new BigInteger("0");
    num = num.setBit(2);
    num = num.setBit(1);
    System.out.println(num);
    System.out.println(num.testBit(2));
    System.out.println(num.testBit(1));
    System.out.println(num.testBit(3));
  }
}

num的值为6,是这样计算的2^2+1^2=6。

 

通过这种方式,不管是解析和查询其实效率都是很高的,占用session的空间也非常的小,不为是一个好的权限设计思路。

打赏一个呗~~

关注我
长按二维码可识别关注
微信号:xwintop
微信号xwintop


追风

爱一个人就像执着于一种梦想,没有值不值得,只有愿不愿意···

关注我
长按二维码可识别关注
微信号:xwintop
微信号xwintop


推荐文章

湄公河行动

2016-10-29 18:39:48
关注我
长按二维码可识别关注
微信号:xwintop
微信号xwintop