HTTP302丢Session

在安卓应用中,当H5页面通过302重定向到同一域名下的另一个页面时,Session可能会丢失。问题关键点与CookieManager.setCookie函数有关,但该函数位于混淆后的代码中,无法直接查看。解决方案包括:1) 修改URL,避免使用/?;2) 使用Host作为Cookie的key。对于深入研究,可以参考Chrome源码,但需下载大量数据。

安卓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的代码需要单独编译,不再集成到安卓系统源码里。
在这里插入图片描述
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");

参考:
https://blog.csdn.net/a957666743/article/details/80061159 下载chrome源码需要30G, 有兴趣的同学可以查看setCookie函数体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值