天天看點

Hessian Token權限認證

添加Token驗證,如何生成Token,計算方式如下,采用不可逆轉的方式生成[MD5加密]: 

伺服器端存儲Token,采用線程安全的Map 

用戶端在發送業務請求前,先去伺服器端申請一個Token,然後發送請求時把token和業務類一起發送,這時會發送請求逾時和權限驗證,因為Token隻有一次有效,廢話不說,代碼如下: 

Token接口: 

Java代碼  

Hessian Token權限認證

public interface TokenGenerator {  

    public String generatorToken(String userName);  

    public boolean validateToken(String token);   

}  

Token實作類: 

Hessian Token權限認證

public class TokenGeneratorImpl implements TokenGenerator {  

    Map<String, Date> tokenStore = new ConcurrentHashMap<String, Date>();  

    /** 

     * 用戶端發送請求得到token. 

     * @param userName 

     * @return 

     */  

    public String generatorToken(String userName){  

        Date time = new Date();  

        try {  

            byte[] b =  (time + DigestUtils.md5Hex(userName)).getBytes("utf-8");  

            String token = DigestUtils.md5Hex(b);   

            tokenStore.put(token,time);//存儲這個時間點的token  

            return token;  

        } catch (UnsupportedEncodingException e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

        return userName;  

    }  

     * 伺服器在接收到請求時驗證token,并把剛才的Token設定為失效 

     * @param token 

    public boolean validateToken(String token){  

        if(tokenStore.containsKey(token)){  

            Date time= tokenStore.get(token);  

            Date normal = new Date();  

            if(normal.getTime() - time.getTime() > 100*1000){  

                //日志進退時  

                return false;  

            }  

            tokenStore.remove(token);  

        }else{  

            //日志,沒有權限  

            return false;  

        return true;  

伺服器端權限判斷: 

Hessian Token權限認證

public String hello() {   

        //Hessian的服務之間怎麼互動,比如我這個服務要用到其他的服務  

            if(tokenGenerator.validateToken(token)){  

                return "hello "  + "歡迎學習Hessian";    

            }else{  

                return "你沒有權限通路!";  

用戶端調用: 

Hessian Token權限認證

String token = tokenGenerator.generatorToken("ycl");  

            Hello hello = (Hello) context.getBean("helloServiceClient");  

            //Spring2.5和hessian3.1果然可以結合.  

            hello.setToken(token);  

            //添加Token參數  

            System.out.println(hello.hello());  

這裡測試很簡單,你可以設定一個Token,然後調用,可以得到正确的資料,如果沒有設定Token則傳回沒有權限,如果等待一分鐘調用,則傳回服務逾時[程式未加提示,自己編寫]. 

這裡的Token你可以試着調用兩次試試,隻有一次會成功.因為調用完一次後就已經失效了. 

這個代碼還未進行優化,隻是按照自己的構想實作了一把,嘿嘿

繼續閱讀