/**
* 类名: TicketHelper <br/>
* 功能: TODO 凭证认证辅助类
* 使用long 数据类型的1-63位二进制位来表示63项权限 ,
* 1.表示有该项权限,0表示没有该项权限
* 例如,ticket:1010 对应的十进制数为10,表示有第二和第四项权限
* 类名: TicketHelper <br/>
* 功能: TODO 凭证认证辅助类
* 使用long 数据类型的1-63位二进制位来表示63项权限 ,
* 1.表示有该项权限,0表示没有该项权限
* 例如,ticket:1010 对应的十进制数为10,表示有第二和第四项权限
* ticket:111 对应的十进制数为7,表示有第一、二、三项权限
public class TicketHelper {
/**
* initTicket:获取最初凭证 <br/>
* @author jiangy
* @return
*/
public static Long initTicket(){
return 0L;
}
/**
* saveTicket:保存凭证,多次保存不会对最后凭证造成影响,每次的保存结果只改变postion位置的二进制位为1<br/>
* @author jiangy
* @param ticket 原始凭证
* @param position 保存位置
* @return 最新凭证
* @throws Exception
*/
public static Long saveTicket(Long ticket ,long position) throws Exception{
ticket = check(ticket,position);
return ticket|(1<<(position-1));
}
/**
* cancelTicket:(取消凭证).多次取消不会对最后凭证造成影响,每次的保存结果只改变postion位置的二进制位为0 <br/>
* @author jiangy
* @param ticket 原始凭证
* @param position 取消位置
* @return 最新凭证
* @throws Exception
*/
public static Long cancelTicket(Long ticket ,long position)throws Exception{
ticket = check(ticket,position);
return ticket&(~(1<<(position-1)));
}
/**
* checkTicket:(凭证认证,返回true,表示有该项权限,false,表示没有该项权限). <br/>
* @author jiangy
* @param ticket 凭证
* @param position 位置
* @return
* @throws Exception 可能超出最大位置63位
*/
public static boolean checkTicket(Long ticket ,long position)throws Exception{
ticket = check(ticket,position);
return (ticket&(1<<(position-1))) >0 ;
}
/**
* check:凭证和权限位置长度检查. <br/>
* @author jiangy
* @param ticket
* @param position
* @throws Exception
*/
private static Long check(Long ticket ,long position) throws Exception{
if(ticket == null){
ticket = 0L;
}
if(position > 63){
throw new Exception("位置超出最大值63");
}
return ticket;
}
}