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不同的问题
场景
登陆页面使用Android写的
(登陆接口访问之后,会在服务器生成一个sessionId)
登陆成功之后,你访问的页面是通过webview来加载的
(用webview.loadUrl(url)时,服务器会看你有没有sessionId,如果没有,重新分配各你一个sessionId,这就导致了两个sessionId不一致)
服务器端要通关过sessionId来判断你的登陆情况,不一致的话,认为你没有登陆,从而不能进行登陆后的操作
思路
- 当登录以后,把cookie(含session)记录下来,赋值给一个变量
- 当使用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();
}
}
.................
}