• 数据库权限优化,权限设计BigInteger


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

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

           

    [java] view plain copy
    1. public static BigInteger sumRights(String[] rights){  
    2.         BigInteger num = new BigInteger("0");  
    3.         for(int i=0; i<rights.length; i++){  
    4.             num = num.setBit(Integer.parseInt(rights[i]));  
    5.         }  
    6.         return num;  
    7.     }  
    通过上面方法,返回一个BigInteger,然后将这个数字存入所属角色的菜单权限字段中。注意的是:这里的菜单ID必须是数字,String[] rights为所选菜单的数组,通过setbit方法一一设置进num中。


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

    [java] view plain copy
    1. public static boolean testRights(BigInteger sum,int targetRights){  
    2.         return sum.testBit(targetRights);  
    3.     }  

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

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

    [java] view plain copy
    1. package com.hundsun.network.post.settle.job;  
    2.   
    3. import java.math.BigInteger;  
    4.   
    5. public class TestBigInteger {  
    6.   
    7.     public static void main(String[] args) {  
    8.         //初始  
    9.         BigInteger num = new BigInteger("0");  
    10.         num = num.setBit(2);  
    11.         num = num.setBit(1);  
    12.         System.out.println(num);  
    13.         System.out.println(num.testBit(2));  
    14.         System.out.println(num.testBit(1));  
    15.         System.out.println(num.testBit(3));  
    16.     }  
    17.   
    18. }  
    num的值为6,是这样计算的2^2+1^2=6。

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

    原文地址:https://blog.csdn.net/qq_39654446/article/details/78197688
  • 相关阅读:
    Android源码分析(二)-----如何编译修改后的framework资源文件
    Android源码分析(一)-----如何快速掌握Android编译文件
    AI2(App Inventor 2)离线版服务器网络版
    AI2(App Inventor 2)离线版服务器单机版
    AI2(App Inventor 2)离线版服务器(2019.04.28更新)
    解释器模式
    迭代器模式
    备忘录模式
    访问者模式
    命令模式
  • 原文地址:https://www.cnblogs.com/jpfss/p/12055557.html
Copyright © 2020-2023  润新知