最近看到了一个项目的权限是根据bigineger来进行计算的菜单权限,觉得还是不错,存储上只需要存储在一个字段里就可以了,通过计算算出该角色的菜单权限即可,效率也非常的快,放在session中也非常的小,下面简单说一下思路。
首先,将界面中选好的菜单树,勾选完成后传到后台,后台通过转成字符串数组来进行设值
[java] view plain copy
- 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做对比来判断是否具有该菜单权限
[java] view plain copy
- public static boolean testRights(BigInteger sum,int targetRights){
- return sum.testBit(targetRights);
- }
sum为对应角色的菜单权限值, targetRights为具体菜单ID,通过biginteger的testBit方法来判断是否存在里面,如果存在就返回true,不存在就返回false.
biginteger通过set的值,其实是2的权的和。下面有一个列子:
[java] view plain copy- 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));
- }
- }
通过这种方式,不管是解析和查询其实效率都是很高的,占用session的空间也非常的小,不为是一个好的权限设计思路。
原文地址:https://blog.csdn.net/qq_39654446/article/details/78197688