Android网络请求获取不到session , 或者sessionid一直变化的原因

做项目有需求给后台传递的json数据 , 这个数据在后续操作中还会使用, 所以我们后台选择了使用session进行临时保存, 我是android 端,访问php接口 , 但在后面接口获取session中的数据时,我获取到的session数据一直为空. 而iOS则可以正常的获取数据.关于Cookie和Session的介绍。

原因和解决方法
  • 原因很简单,就是因为android手机端在访问web服务器时,没有给http请求头部设置sessionID
  • 解决方法, 第一次请求成功。需要把session的值保存起来.再后续需要使用session的时候,将传递保存的sessionID传过去
本地存储sessionID(这里以Retrofit自定义拦截器来保存sessionID)
public class commonInterceptor implements Interceptor {
  @Override
    public Response intercept(Chain chain) throws IOException {


        Request request = chain.request();
       //添加公共参数
        if (request.method().equals("GET")) {
            request = addGetParams(request);
        } else if (request.method().equals("POST")) {
            request = addPostParams(request);
        }
        //判断接口是否需要使用session
        if (SPUtils.getInstance().getBoolean(MultipleFields.UPDATE_COOKIES.toString(), false)) {
           //获取Cookie
            getCookie(chain, request);
            Request request_cookie = setCookie(request);
            return chain.proceed(request_cookie);
        }
        return chain.proceed(request);
    }

   private void getCookie(Chain chain, Request request) throws IOException {
         // 获取 Cookie
         Response resp = chain.proceed(request);
         List cookies = resp.headers("Set-Cookie");
         String cookieStr = "";
         if (cookies != null && cookies.size() > 0) {
             String s = cookies.get(0);
             //sessionid值格式:JSESSIONID=AD5F5C9EEB16C71EC3725DBF209F6178,是键值对,不是单指值
             cookieStr = s.substring(0, s.indexOf(";"));
             //持久化到本地
             SPUtils.getInstance().put(MultipleFields.COOKIES.toString(), cookieStr);
         }

     }

   private Request setCookie(Request request) {
        //设置cookie
        String cookieStr = SPUtils.getInstance().getString(MultipleFields.COOKIES.toString(), "");
        //判断cookie不为空
        if (!cookieStr.isEmpty()) {
            Request cookieRequest = request.newBuilder().addHeader("Cookie", cookieStr).build();
            return cookieRequest ;
        }
        return request;
    }
 }

存储后发现仍然无法获取到对应的session中的数据 , 最后发现每次从后台获取到的sessionId ,都时不同的, 是一直变化的, 最后发现这个需要后台也做相应的处理 ,服务器需要根据传过去sessionID获取对应的Session,而不是重新创建一个新Session(除了这个Session失效)。

php代码
  • 第一次创建session 直接session_start();
session_start();
  • 再次使用刚才session时要根据传过去sessionID获取对应的Session,而不是重新创建一个新Session
$cookData = $_SERVER['HTTP_COOKIE']; 
$sessionid = substr($cookData,strpos($cookData,'=')+1);
Session_id($sessionid);
session_start();

你可能感兴趣的:(Android网络请求获取不到session , 或者sessionid一直变化的原因)