做项目有需求给后台传递的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();
网友评论