安卓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裏, 安卓系統源碼裏壓根就沒有。。。
遇到這種問題時有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");