Android不同Activity同一会话请求Servlet无法识别会话问题
问题根因
Java Servlet的会话身份识别依赖请求头Cookie字段中携带的JSESSIONID值,你虽然在登录成功后获取到了会话ID,但是后续请求中没有将会话ID正确填充到请求头的Cookie字段中,服务端无法识别当前请求对应的已登录会话,因此返回未登录的报错。
修复方案
方案1:手动在后续请求中携带JSESSIONID
修改你的CustomRequest类,重写getHeaders方法,将传入的sessionId按规范写入Cookie头:
@Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); // 填入会话ID if (sessionId != null && !sessionId.trim().isEmpty()) { headers.put("Cookie", "JSESSIONID=" + sessionId); } return headers; }
确认你传入CustomRequest构造函数的sessionId参数已经被正确接收并在上述方法中使用即可。
方案2:开启Volley全局Cookie自动管理(更省心)
不需要手动解析、传递sessionId,直接让Volley自动处理所有Cookie:
在你应用的Application类的onCreate方法中添加如下初始化代码:
// 初始化全局Cookie管理器 CookieManager cookieManager = new CookieManager(); CookieHandler.setDefault(cookieManager);
这样登录请求收到的服务端Set-Cookie响应头会被自动保存,后续所有请求都会自动携带对应的Cookie信息,无需手动处理会话ID。
优化建议
你当前的登录接口使用GET方法传递账号密码,敏感信息会明文出现在请求URL、服务端日志中,存在泄露风险,建议将登录接口改为POST方法,参数放在请求体中传输。
内容的提问来源于stack exchange,提问作者Allen
相关产品推荐
相关产品推荐

