HTTP302丟Session

安卓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裏, 安卓系統源碼裏壓根就沒有。。。
setCookie函數體應該在這裏遇到這種問題時有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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章