先抛出问题 为什么第二次从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 }
这个办法肯定不适用于所用人,但能够适用于大部分人就好了,
原文地址:https://www.cnblogs.com/yyKong/p/12206761.html
时间: 2024-11-13 03:22:59