美文网首页
Android网络请求获取不到session , 或者sessi

Android网络请求获取不到session , 或者sessi

作者: 呵呵豆 | 来源:发表于2019-04-09 19:11 被阅读0次

    做项目有需求给后台传递的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<String> 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 , 或者sessi

          本文链接:https://www.haomeiwen.com/subject/spyiiqtx.html