两次http请求获取的session内容不一致,但又希望能够判断token怎么办

Posted yykong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两次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 }

 



这个办法肯定不适用于所用人,但能够适用于大部分人就好了,

以上是关于两次http请求获取的session内容不一致,但又希望能够判断token怎么办的主要内容,如果未能解决你的问题,请参考以下文章

解决小程序sessionid不一致

JAVA代码发送HTTP请求问题(我想实现和服务器进行一次连接时发送两次请求)

Java中session保存和获取验证码获取的id不一致问题

Django - cookies 会话跟踪技术

session一致性的解决方案

使用HttpSession实现验证码