webview的postURL以及webview中SessionID同步

webview的postURL

//第一步:拼接请求参数
 String postData = "username=" + username
                + "&psw=" + psw
                + "&time=" + time
                + "&token=" + token;
//第二步:直接postURl
        webview.postUrl(url
                , EncodingUtils.getBytes(postData, "BASE64"));

不要以为这么简单就完了,坑在第二步的

 EncodingUtils.getBytes(postData, "BASE64"));

你会发现没有这个类,但是在Android的官方文档,却可以看到这个类

这里写图片描述

发现这个类在org.apache.http.util.EncodingUtils
所以你还差一步

 compile 'org.apache.httpcomponents:httpcore:4.4.4'

webview中SessionID同步

首先感谢这篇文章 Android的HttpClient和WebView session不同的问题

场景

  1. 登陆页面使用Android写的

    (登陆接口访问之后,会在服务器生成一个sessionId)

  2. 登陆成功之后,你访问的页面是通过webview来加载的

    (用webview.loadUrl(url)时,服务器会看你有没有sessionId,如果没有,重新分配各你一个sessionId,这就导致了两个sessionId不一致)

  3. 服务器端要通关过sessionId来判断你的登陆情况,不一致的话,认为你没有登陆,从而不能进行登陆后的操作

思路

  1. 当登录以后,把cookie(含session)记录下来,赋值给一个变量
  2. 当使用webview.loadUrl(url)时候,先在该webview所在的Activity里把这个cookie添加进来,这样当webview.loadUrl(url)时,就会把这个cookie(含session)传给服务器,让服务器认为你在登陆状态中的操作

代码

第一步、拿到cookie

上面说的第一步得到cookie,根据你使用的网络框架不同,会有所不同,这里拿retrofit(其本质是okhttp)举例子

下面的代码同时实现了每次使用retrofit请求时,都同步了cookie,也就是说如果你登录时用retrofit请求产生了一个cookie,第二次打开的虽然是Android写的页面,但是再一次retrofit请求时也会产生一个cookie,两次cookie不一致,会导致认为你没登陆

//先配置OkHttpClient
  OkHttpClient client = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();

                    @Override
                    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                    //这里把cookies存起来
                        cookieStore.put(url, cookies);
                        if (!cookies.isEmpty()) {
                            for (int i = 0; i < cookies.size(); i++) {
                               //拿到了cookie,把他赋值给了MyApp.cookie
                                MyApp.cookie = cookies.get(i);
                            }
                        }
                    }

                    @Override
                    public List<Cookie> loadForRequest(HttpUrl url) {
                        List<Cookie> cookies = cookieStore.get(url);
                        //这里把第一次拿到的cookies赋值给cookies,这样就保证了每次请求服务器,都是相同的cookies
                        return cookies != null ? cookies : new ArrayList<Cookie>();
                    }
                }).build();


//      retrofit可以配置okhttp、解析方式、支持RxJava等
        Retrofit retrofit = new Retrofit.Builder()
                .client(client)//使用了上面的同步cookie策略
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl(UrlUtils.BASE_URL)
                .build();
第二步、把cookie设置给webview所在的Activity(在webview.loadUrl(url)之前)

public class extends   extends BaseActivity{ 

..............
/**
     * 为了保证session的一致性,当登陆访问服务器后,会生成一个cookie,
     * 把这个cookie赋值给MyApp.cookie
     * 在这里又把MyApp.cookie赋值给这个Activity,
     * 从而使得在这个Activity里面的webview在loadurl时候也用这个cookie(内含sessionID)
     */
    private void synchSessionID() {

        Cookie sessionCookie = MyApp.cookie;    //这里的cookie就是上面保存的cookie
        CookieSyncManager.createInstance(this);
        CookieManager cookieManager = CookieManager.getInstance();
        if (sessionCookie != null) {
            cookieManager.removeSessionCookie();
            String cookieString = sessionCookie.name() + "=" + sessionCookie.value() + "; domain=" + sessionCookie.domain();
            cookieManager.setCookie(UrlUtils.BASE_URL, cookieString);
            Log.e("qqq", cookieString);
            CookieSyncManager.getInstance().sync();
        }
    }
    .................
}

其他参考

  1. 【WebView的cookie机制 】轻松搞定WebView cookie同步问题
  2. android HttpClient+WebView 同步sessionId 和cookie
  3. android实现session登录保持
  4. Retrofit2.0 完美同步Cookie实现免登录
  5. Android利用Cookie实现码源登录效果
  6. Retrofit+OKHttp 教你怎么持久化管理 Cookie
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值