简单讲解下权限的设计方式,包含64位怎么对应或产生的:
比如:用户登录后有一个权限集合(集合里面的内容是什么),用户访问一个url等
比如:用户登录后有一个权限集合(集合里面的内容是什么),用户访问一个url等
解决方案 »
- 同一文件中,对象的修饰符问题
- [求助]制作是一个绘制地图软件的问题!!
- 请问哪能下载THINKING IN JAVA??
- 很菜的一个问题,jsp+javaBean连接数据库
- 你动了你的鼠标了吗?屏幕捕捉求解
- 打jar包的问题~~~~~至急
- 100分求一个java小程序
- 急!!!!!help!怎么也看不懂这段代码怎么执行??
- 我用DatabaseMetaData中的getPrimaryKey()返回的是ResultSet是空集?
- 请问如何用java实现ie的save as...的功能?(200分求解,不够另加)
- 跪求 如何用JTextArea实现类似cmd中路径名称C:\Documents and Settings\lihongpucc>不可以删除的效果!
- 几个基础的java笔试题
说不清楚
于是所有操作就一字排开。有多少操作呢?我们保守点估计,假设总共有64*64(=4096)这么多操作,一般都没有这么多的。
好了,现在你面前就一排小朋友,有4096个小朋友,排了一条长长的队。每个小朋友手里拿了一个号,从1到4096。
每个小朋友代表一个操作。
假设小朋友的亲戚才可以把小朋友领走。
那么如果你是一个用户,你要来领5号小朋友(你要做5号操作),你怎么办呢?
你就跑到5号小朋友身边,看他认识你不?认识了,信任了,是他亲戚了,就把他领走。基于这个思路:
我们做这样的事情:
把操作一字排开,操作码为从1到4096。用位来存,即每个2进制位存一个操作。一个long是8个字节,也就是64个二进制位。
所以4096个操作就需要64个long来表示。所以,你看到了一个64个元素的long数组。然后每个用户呢,他手里的一对操作也就对应到了每个二进制位上。比如在第5个位上他有这个权限,这个位上为1,否则为0;
这样,每个用户一登录,就根据他的操作权限为他生成了一个他自己的long数组。放到内存中。
当他要做某个操作时,比如5号操作,为 0001 0000,那么用用户手里的long数组与此操作进行“与”运算。其他位“与”0肯定=0。
就看第5位,如果第5位原来是1,那么1&1=1;如果是0&1=0。如果结果还是等于0001 0000,就说明你的数组中第5位是1,你可以操作;
否则,为0000 0000,说明你的数组中第5位是0,你不可以操作。
/**
* long[] operationNoToCode={1,2,4,8......}每一个元素对应一个位是一
* 1:000001;2:000010;4:000100,如果他具有的操作编号是1~63,那么
* 转化出来的数组中的第一个元素的值就应该是011111111111(大致是63个1)
* 假如你从外面点击了一个操作,该操作为5,那么就用找到存放位元素的
* operationNoToCode数组中找到第5个元素(2*2*2*2)与(&)上该转化出来的
* 011111111111(大致是63个1),得到的是本身就说明有权限
*/
private static final long[] operationNoToCode = {
0x0000000000000001L, 0x0000000000000002L, 0x0000000000000004L, 0x0000000000000008L,
0x0000000000000010L, 0x0000000000000020L, 0x0000000000000040L, 0x0000000000000080L,
0x0000000000000100L, 0x0000000000000200L, 0x0000000000000400L, 0x0000000000000800L,
0x0000000000001000L, 0x0000000000002000L, 0x0000000000004000L, 0x0000000000008000L,
0x0000000000010000L, 0x0000000000020000L, 0x0000000000040000L, 0x0000000000080000L,
0x0000000000100000L, 0x0000000000200000L, 0x0000000000400000L, 0x0000000000800000L,
0x0000000001000000L, 0x0000000002000000L, 0x0000000004000000L, 0x0000000008000000L,
0x0000000010000000L, 0x0000000020000000L, 0x0000000040000000L, 0x0000000080000000L,
0x0000000100000000L, 0x0000000200000000L, 0x0000000400000000L, 0x0000000800000000L,
0x0000001000000000L, 0x0000002000000000L, 0x0000004000000000L, 0x0000008000000000L,
0x0000010000000000L, 0x0000020000000000L, 0x0000040000000000L, 0x0000080000000000L,
0x0000100000000000L, 0x0000200000000000L, 0x0000400000000000L, 0x0000800000000000L,
0x0001000000000000L, 0x0002000000000000L, 0x0004000000000000L, 0x0008000000000000L,
0x0010000000000000L, 0x0020000000000000L, 0x0040000000000000L, 0x0080000000000000L,
0x0100000000000000L, 0x0200000000000000L, 0x0400000000000000L, 0x0800000000000000L,
0x1000000000000000L, 0x2000000000000000L, 0x4000000000000000L, 0x8000000000000000L};
private static final int operationCodeLength = 11; public static long[] convertOperationNosToOperationCode(short[] operationNos) {
long[] operationCode = new long[operationCodeLength];
for(int i = 0; i < operationNos.length; i ++) {
int m = operationNos[i] / 64;
int n = operationNos[i] % 64;
System.out.println("m"+operationCode[m]);
operationCode[m] |= operationNoToCode[n];
System.out.println(operationNoToCode[n]);
}
return operationCode;
}
public static boolean canDo(short operationNo, long[] operationCode) {
int m = operationNo / 64;
int n = operationNo % 64;
return ((operationCode[m] & operationNoToCode[n]) == operationNoToCode[n]);
}
public static void main(String[] args) {
short[] operationNos={1,2,3};
long[] operationCode = convertOperationNosToOperationCode(operationNos);
for(int i = 0; i < operationCode.length; i ++) {
System.out.println(String.valueOf(i)+":"+operationCode[i]);
}
}
}