安卓app在打开第一个H5页面时app设置了Session, H5返回302跳转到相同域下的另一个H5, 这时丢了Session。
public class MainActivity extends Activity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = findViewById(R.id.webview);
initWebView();
setCookies("http://test-hulkm.lianjia.com/nj/haofang/yezhu/?housedel_code=103100001066");
mWebView.loadUrl("http://test-hulkm.lianjia.com/nj/haofang/yezhu/?housedel_code=103100001066");
findViewById(R.id.btn_lianjia).setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
mWebView.loadUrl("http://test-hulkm.lianjia.com/nj/haofang/biaodan?housedel_code=103100001066");
}
});
}
private void setCookies(String url) {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
String host = Uri.parse(url).getHost();
try {
cookieManager.setCookie(url, "brycegao_ssid=1111");
} catch (Exception ex) {
ex.printStackTrace();
}
cookieManager.setCookie(url, "brycegao_token=aaaaabbbbcccc");
}
private void initWebView() {
mWebView.setVerticalScrollBarEnabled(true);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
WebSettings settings = mWebView.getSettings();
settings.setUseWideViewPort(true);
settings.setDomStorageEnabled(true);
settings.setJavaScriptEnabled(true);
// 设置可以支持缩放
settings.setSupportZoom(false);
// 设置出现缩放工具
settings.setBuiltInZoomControls(false);
// 扩大比例的缩放
settings.setUseWideViewPort(true);
// 自适应屏幕
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setLoadWithOverviewMode(true);
settings.setLoadsImagesAutomatically(true);
// 设置UA
// mWebView.setInitialScale(70);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//在安卓5.0之后,默认不允许加载http与https混合内容,需要设置webview允许其加载混合网络协议内容
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
//设置运行跨域读取cookie
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
}
//For security reasons
if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT < 17) {
try {
mWebView.removeJavascriptInterface("searchBoxJavaBridge_");
mWebView.removeJavascriptInterface("accessibility");
mWebView.removeJavascriptInterface("accessibilityTraversal");
} catch (Throwable tr) {
}
}
}
}
写个Demo说明下问题, 在打开第一个H5页面时http://test-hulkm.lianjia.com/nj/haofang/yezhu/?housedel_code=103100001066设置了Session, 抓包可以看到

点击按钮(模拟HTTP302)打开另一个url http://test-hulkm.lianjia.com/nj/haofang/biaodan?housedel_code=103100001066时app设置的brycegao_ssid和brycegao_token丢了。

问题的关键点在于CookieManager.setCookie函数, 但遗憾的是找不到函数体, 打断点看到的混淆后的类名函数名, 在安卓系统源码里也没找到。。。 看样子是在so里, 安卓系统源码里压根就没有。。。
从Android M(6.0)版本后, chrome的代码需要单独编译,不再集成到安卓系统源码里。


遇到这种问题时有2个解决办法:
1、 url里包含/?, 这不是标准的url定义方式。 将第一个url改为http://test-hulkm.lianjia.com/nj/haofang/yezhu?housedel_code=103100001066后再跳转到第二个url就不丢session了;
2、使用host作为key值, 例如
String host = Uri.parse(url).getHost();
cookieManager.setCookie(host, "brycegao_ssid=1111");
参考:
https://blog.csdn.net/a957666743/article/details/80061159 下载chrome源码需要30G, 有兴趣的同学可以查看setCookie函数体
在安卓应用中,当H5页面通过302重定向到同一域名下的另一个页面时,Session可能会丢失。问题关键点与CookieManager.setCookie函数有关,但该函数位于混淆后的代码中,无法直接查看。解决方案包括:1) 修改URL,避免使用/?;2) 使用Host作为Cookie的key。对于深入研究,可以参考Chrome源码,但需下载大量数据。
9237

被折叠的 条评论
为什么被折叠?



