先拋出問題 為什么第二次從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 }
這個辦法肯定不適用於所用人,但能夠適用於大部分人就好了,