Hessian Token权限认证

 

博客分类:
 
添加Token验证,如何生成Token,计算方式如下,采用不可逆转的方式生成[MD5加密]: 
服务器端存储Token,采用线程安全的Map 
客户端在发送业务请求前,先去服务器端申请一个Token,然后发送请求时把token和业务类一起发送,这时会发送请求超时和权限验证,因为Token只有一次有效,废话不说,代码如下: 
Token接口: 
Java代码  收藏代码
  1. public interface TokenGenerator {  
  2.   
  3.     public String generatorToken(String userName);  
  4.       
  5.     public boolean validateToken(String token);   
  6. }  

Token实现类: 
Java代码  收藏代码
  1. public class TokenGeneratorImpl implements TokenGenerator {  
  2.    
  3.     Map<String, Date> tokenStore = new ConcurrentHashMap<String, Date>();  
  4.       
  5.     /** 
  6.      * 客户端发送请求得到token. 
  7.      * @param userName 
  8.      * @return 
  9.      */  
  10.     public String generatorToken(String userName){  
  11.         Date time = new Date();  
  12.         try {  
  13.             byte[] b =  (time + DigestUtils.md5Hex(userName)).getBytes("utf-8");  
  14.             String token = DigestUtils.md5Hex(b);   
  15.             tokenStore.put(token,time);//存储这个时间点的token  
  16.             return token;  
  17.         } catch (UnsupportedEncodingException e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.         }  
  21.         return userName;  
  22.     }  
  23.       
  24.     /** 
  25.      * 服务器在接收到请求时验证token,并把刚才的Token设置为失效 
  26.      * @param token 
  27.      * @return 
  28.      */  
  29.     public boolean validateToken(String token){  
  30.         if(tokenStore.containsKey(token)){  
  31.             Date time= tokenStore.get(token);  
  32.             Date normal = new Date();  
  33.             if(normal.getTime() - time.getTime() > 100*1000){  
  34.                 //日志进退时  
  35.                 return false;  
  36.             }  
  37.             tokenStore.remove(token);  
  38.         }else{  
  39.             //日志,没有权限  
  40.             return false;  
  41.         }  
  42.         return true;  
  43.     }  

服务器端权限判断: 
Java代码  收藏代码
  1. public String hello() {   
  2.         //Hessian的服务之间怎么交互,比如我这个服务要用到其他的服务  
  3.             if(tokenGenerator.validateToken(token)){  
  4.                 return "hello "  + "欢迎学习Hessian";    
  5.             }else{  
  6.                 return "你没有权限访问!";  
  7.             }  
  8.               
  9.     }  


客户端调用: 
Java代码  收藏代码
  1. String token = tokenGenerator.generatorToken("ycl");  
  2.   
  3.             Hello hello = (Hello) context.getBean("helloServiceClient");  
  4.             //Spring2.5和hessian3.1果然可以结合.  
  5.               
  6.             hello.setToken(token);  
  7.             //添加Token参数  
  8.   
  9.             System.out.println(hello.hello());  

这里测试很简单,你可以设置一个Token,然后调用,可以得到正确的数据,如果没有设置Token则返回没有权限,如果等待一分钟调用,则返回服务超时[程序未加提示,自己编写]. 
这里的Token你可以试着调用两次试试,只有一次会成功.因为调用完一次后就已经失效了. 
这个代码还未进行优化,只是按照自己的构想实现了一把,嘿嘿
原文地址:https://www.cnblogs.com/u0mo5/p/4170862.html