PHP跨文件$_SESSION变量获取失败问题求助
会话(Session)跨请求丢失排查方案
检查Retrofit的Cookie携带机制
PHP Session依赖PHPSESSIDCookie识别会话,但Retrofit默认不会自动保存和携带Cookie。需为Retrofit配置Cookie持久化:CookieJar cookieJar = new CookieJar() { private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>(); @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { cookieStore.put(url.host(), cookies); } @Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> cookies = cookieStore.get(url.host()); return cookies != null ? cookies : new ArrayList<>(); } }; OkHttpClient client = new OkHttpClient.Builder() .cookieJar(cookieJar) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build();验证PHP端Session的Cookie配置
检查php.ini关键参数:session.cookie_domain:若服务与Android应用域名/IP不同,需注释该配置或设为对应值;session.cookie_secure:HTTP测试时必须设为Off,HTTPS环境设为On;session.cookie_httponly:设为On不影响Retrofit,但需确保无前端JS操作Cookie的场景。
在PHP端添加调试日志
在addrelease.php开头加入调试代码,确认会话识别状态:<?php session_start(); // 写入服务器日志 error_log("当前Session ID: " . session_id()); error_log("Session中user_id值: " . (isset($_SESSION['user_id']) ? $_SESSION['user_id'] : '未设置')); // 临时返回调试信息给Android(测试用) echo json_encode([ 'session_id' => session_id(), 'user_id' => isset($_SESSION['user_id']) ? $_SESSION['user_id'] : null ]); exit;对比
loginuser.php输出的Session ID,若不一致则说明会话未正确传递。处理跨域(CORS)配置
若服务与Android应用跨域,需在PHP端设置允许携带Cookie的CORS头:header("Access-Control-Allow-Origin: 你的Android应用IP/域名"); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Methods: POST, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type");注意
Access-Control-Allow-Origin不能设为*,必须指定具体地址。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

