两次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