兩次http請求獲取的session內容不一致,但又希望能夠判斷token怎么辦



   先拋出問題 為什么第二次從A系統請求B系統的Session發現東西沒了。但是需要取出來比較,這可怎么辦?
   別急,希望看完能幫到你


因為通過http去獲取token,然后接口那邊將token存放到session,token返回時
你需要帶着token去請求別數據/其他操作(什么操作我不管)
下面說一下之前的一個demo
我需要通過www.token.com/getToken(舉例)獲取token
接口條用getTokenString(HttpSession session)方法,然后將獲取的token保存至一個arrayList,在保存進session
這個時候你通過另一個項目發送的請求,request請求域中session是空的,但是當你在當前系統中request請求域中的session不是一個空值
當請求域中的session是空的時候,會new一個session,那么你的token就保存在了一個新創建的session
這時你將token返回,帶着token去請求另一個接口,但是這時你需要驗證第一token是否重復使用了,第二就是時效性
這里我調用的是isTokenStringValid(String tokenStr, HttpSession session)方法驗證token,
獲取token又要從請求域中拿一個session傳參,這時候你會發現你請求域中的session又是空的,那么這時你的token肯定驗證失敗的
因為session為空,程序有new了一個新的session,存token和取token在兩個不同的的session里,肯拿不到。
你們肯定會問了,這是什么問題,這個難道沒有解決辦法嗎?
其實這是個跨域的問題,我暫時是沒想到什么好的方案,都比較麻煩
但實際上token可以不存session中,其實放在arrayList中就可以了。
可能有人要說,玩意程序掛了,token不就沒了,那你放session里不是一樣沒了
其實只要程序沒掛,放arrayList是一樣的
下面貼兩分代碼,一份是放session的,另一份是放arrayList,

   放sessio如下:
 1 package com.ilas.union.bigdataPlatform.common.util;  2 
 3 import javax.servlet.http.HttpSession;  4 import java.util.ArrayList;  5 import java.util.UUID;
10 
11 public class TokenUtli { 12     private static final String TOKEN_LIST_NAME = "tokenList"; 13 
14     private static ArrayList getTokenList(HttpSession session) { 15         Object obj = session.getAttribute(TOKEN_LIST_NAME); 16         if (obj != null) { 17             return (ArrayList) obj; 18         } else { 19             ArrayList tokenList = new ArrayList(); 20  session.setAttribute(TOKEN_LIST_NAME, tokenList); 21             return tokenList; 22  } 23  } 24 
25     private static void saveTokenString(String tokenStr, HttpSession session) { 26         ArrayList tokenList = getTokenList(session); 27  tokenList.add(tokenStr); 28  session.setAttribute(TOKEN_LIST_NAME, tokenList); 29  } 30 
31     private static String generateTokenString(){ 32         return Long.toString(System.currentTimeMillis())+"_"+UUID.randomUUID().toString(); 33  } 34 
35 
36     public static String getTokenString(HttpSession session) { 37         String tokenStr = generateTokenString(); 38  saveTokenString(tokenStr, session); 39         return tokenStr; 40  } 41 
42 
43 
44     public static boolean isTokenStringValid(String tokenStr, HttpSession session) { 45         boolean valid = false; 46         if(session != null){ 47             ArrayList tokenList = getTokenList(session); 48             if (tokenList.contains(tokenStr)) { 49                 valid = true; 50  tokenList.remove(tokenStr); 51  } 52  } 53         return valid; 54  } 55 
56 }

 

    放arrayList如下:
 1 package com.common.utils;  2 
 3 5 import java.util.ArrayList;  6 import java.util.UUID;
11 
12 public class TokenUtli {14     private static ArrayList tokenList = new ArrayList(); 15 
16     private static ArrayList getTokenList() {18         if (tokenList != null) { 19             return tokenList; 20         } else { 21             ArrayList tokenList = new ArrayList();
23             return tokenList; 24  } 25  } 26 
27     private static void saveTokenString(String tokenStr) { 28         tokenList = getTokenList(); 29  tokenList.add(tokenStr);
31  } 32 
33     private static String generateTokenString(){ 34         return Long.toString(System.currentTimeMillis())+"_"+UUID.randomUUID().toString(); 35  } 36 
37 
38     public static String getTokenString() { 39         String tokenStr = generateTokenString(); 40  saveTokenString(tokenStr); 41         return tokenStr; 42  } 43 
44 
45 
46     public static boolean isTokenStringValid() { 47         boolean valid = false; 48         if(tokenList!= null){ 49             ArrayList list = tokenList; 50             if (list.contains(tokenStr)) { 51                 valid = true; 52  list.remove(tokenStr); 53  } 54  } 55         return valid; 56  } 57 
58 }
 
         
         
        

 



這個辦法肯定不適用於所用人,但能夠適用於大部分人就好了,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM