问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么.net开发的webapp在android机上不能鎐ookie

发布网友 发布时间:2022-04-23 23:06

我来回答

1个回答

热心网友 时间:2023-09-09 00:38

Android中在使用OkHttp这个库的时候,有时候需要持久化Cookie,那么怎么实现呢。OkHttp的内部源码过于复杂,不进行深究,这里只看其中的HttpEngineer里面的部分源码,在发起请求以及请求结束都会调用这个类的几个方法。我们先看networkRequest方法,在里面通过client.getCookieHandler()函数获得了CookieHandler对象,通过该对象拿到cookie并设置到请求头里,请求结束后取得响应后通过networkResponse.headers()函数将请求头获得传入receiveHeaders函数,并将取得的cookie存入getCookieHandler得到的一个CookieHandler对象中去
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

This client doesn't specify a default {@code Accept} header because it
* doesn't know what content types the application is interested in.
*/
private Request networkRequest(Request request) throws IOException {
Request.Builder result = request.newBuilder();

//此处省略n行代码......

CookieHandler cookieHandler = client.getCookieHandler();
if (cookieHandler != null) {
// Capture the request headers added so far so that they can be offered to the CookieHandler.
// This is mostly to stay close to the RI; it is unlikely any of the headers above would
// affect cookie choice besides Host.
Map<string, string="">> headers = OkHeaders.toMultimap(result.build().headers(), null);

Map<string, string="">> cookies = cookieHandler.get(request.uri(), headers);

// Add any new cookies to the request.
OkHeaders.addCookies(result, cookies);
}

//此处省略n行代码......

return result.build();
} data-snippet-id=ext.4df17b386793c68468195a690c917859 data-snippet-saved=false data-csrftoken=bFkHGE1O-cy7WY9D6w70F6qK9YUKZHLynI5g data-codota-status=done><code class="hljs" java="">/**
* Populates request with defaults and cookies.
*
* </code><p><code class="hljs" java="">This client doesn't specify a default {@code Accept} header because it
* doesn't know what content types the application is interested in.
*/
private Request networkRequest(Request request) throws IOException {
Request.Builder result = request.newBuilder();

//此处省略n行代码......

CookieHandler cookieHandler = client.getCookieHandler();
if (cookieHandler != null) {
// Capture the request headers added so far so that they can be offered to the CookieHandler.
// This is mostly to stay close to the RI; it is unlikely any of the headers above would
// affect cookie choice besides Host.
Map<string, string="">> headers = OkHeaders.toMultimap(result.build().headers(), null);

Map<string, string="">> cookies = cookieHandler.get(request.uri(), headers);

// Add any new cookies to the request.
OkHeaders.addCookies(result, cookies);
}

//此处省略n行代码......

return result.build();
}</string,></string,></code></p></string,></string,>

?

1
2
3
4
5
6
7

<code class="hljs" java="">public void readResponse() throws IOException {
//此处省略n行代码......

receiveHeaders(networkResponse.headers());

//此处省略n行代码......
}</code>

?

1
2
3
4
5
6

<code class="hljs" java="">public void receiveHeaders(Headers headers) throws IOException {
CookieHandler cookieHandler = client.getCookieHandler();
if (cookieHandler != null) {
cookieHandler.put(userRequest.uri(), OkHeaders.toMultimap(headers, null));
}
}</code>

而这个CookieHandler对象是OkHttpClient类中的一个属性,提供了getter和setter方法,默认的构造函数OkHttpClient client = new OkHttpClient();不会创建这个CookieHandler对象。假设我们传入了这个对象,那么OkHttp自然会进行cookie的自动管理了。
?

1
2
3
4
5
6
7
8
9

<code class="hljs" cs="">private CookieHandler cookieHandler;
public OkHttpClient setCookieHandler(CookieHandler cookieHandler) {
this.cookieHandler = cookieHandler;
return this;
}

public CookieHandler getCookieHandler() {
return cookieHandler;
}</code>

那么假设我们将CookieHandler对象传入
?

1
2

<code axapta="" class="hljs">OkHttpClient client = new OkHttpClient();
client.setCookieHandler(CookieHandler cookieHanlder);</code>

那么,现在关键是如何去实现这个CookieHandler 对象。CookieManager是CookieHandler 的一个子类,其构造函数 public CookieManager(CookieStore store, CookiePolicy cookiePolicy)需要传入两个参数,CookieStore 是一个接口,因此我们实现CookieStore接口中的抽象方法,即可实现这个CookieHandler 对象。参考android-async-http这个库,它具有cookie的自动管理功能,主要我们参考其中的两个类
PersistentCookieStore SerializableCookie
参考以上两个类并做适当修改,得到了如下两个类,他们的功能就是将cookie保持在SharedPreferences中。
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

<code avrasm="" class="hljs">package com.kltz88.okhttp.cookie;

/**
* User:lizhangqu(513163535@qq.com)
* Date:2015-07-13
* Time: 17:31
*/
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.HttpCookie;

public class SerializableHttpCookie implements Serializable {
private static final long serialVersionUID = 6374381323722046732L;

private transient final HttpCookie cookie;
private transient HttpCookie clientCookie;

public SerializableHttpCookie(HttpCookie cookie) {
this.cookie = cookie;
}

public HttpCookie getCookie() {
HttpCookie bestCookie = cookie;
if (clientCookie != null) {
bestCookie = clientCookie;
}
return bestCookie;
}

private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(cookie.getName());
out.writeObject(cookie.getValue());
out.writeObject(cookie.getComment());
out.writeObject(cookie.getCommentURL());
out.writeObject(cookie.getDomain());
out.writeLong(cookie.getMaxAge());
out.writeObject(cookie.getPath());
out.writeObject(cookie.getPortlist());
out.writeInt(cookie.getVersion());
out.writeBoolean(cookie.getSecure());
out.writeBoolean(cookie.getDiscard());
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
String name = (String) in.readObject();
String value = (String) in.readObject();
clientCookie = new HttpCookie(name, value);
clientCookie.setComment((String) in.readObject());
clientCookie.setCommentURL((String) in.readObject());
clientCookie.setDomain((String) in.readObject());
clientCookie.setMaxAge(in.readLong());
clientCookie.setPath((String) in.readObject());
clientCookie.setPortlist((String) in.readObject());
clientCookie.setVersion(in.readInt());
clientCookie.setSecure(in.readBoolean());
clientCookie.setDiscard(in.readBoolean());
}
}</code>

?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
健康码没有变红,但时间显示阳变红了 贵州健康码登录不了怎么办 北京有哪些好吃的西餐厅推荐? 什么是 辰、戌、丑、未?它们代表了什么意思? 《辰戌丑未四墓库》详解 干货:"辰戌丑未"四墓库用法详解 吃四环素有哪些副作用 吃了四环素片对身体有害吗 盐酸四环素片的不良反应有哪些呢? 服用四环素的副作用 webapp 怎么样使页面变小 HBuilder Android APP打包WebApp,Web视频播放不能全屏,如何解决_百度... webapp套用android的webview的壳子.怎么做数据交互 手机WebApp是什么? webapp如何在安卓手机上通过图标访问ip地址 android studio能开发webapp吗 Android端webapp开发视频压缩有什么解决方案吗 原生android跟webApp那个更好? android WebApp 集成方式怎么使用java调用js 港货的Apple TV在国内能用吗? Apple TV国内能用吗 苹果中国官网惊现Apple TV国行 韩国买的APPLE TV中国能用吗? apple tv4 国内可以安装应用吗 Apple tv在国内可以看点播吗? 请问APPLE TV是否可以在大陆正常使用 收看电视节目? 苹果tv中国大陆能用吗? APPLE TV如果在国内能用的话,能不能看央 视? apple tv在中国怎么用怎么看中国的电视节目? 为什么看期房报备 买期房只给收据合理吗,是否要去备案 没有了target-densitydpi怎么才能使webapp适应4.4以上android 纯H5开发的webAPP 安卓端可以横屏,但是ios端不能横屏,请问怎么解决 网页不能适应安卓app 如何调试Android和IOS的webview 目前手机webapp用什么软件开发 计算机毕业设计,不会啊,搞个后台还勉强可以,差不多也就增删改查。老师给的是做android前端 电脑声音信号怎么变成灯光信号? 如何将电子音频信号,转换成光纤信号 光电转换器,和光纤收发器的区别及作用 音频输出光纤好,还是同轴好 请问MOST光纤音频解码器是什么东西,有没有谁知道,求解答? 用在DVD输出的音频光纤和网络上使用的光纤有区别么?可否通用?? 数字同轴转光纤音频互转转换器具体哪款好一些? 音频输出用&quot;同轴&quot;好还是&quot;光纤&quot;好 音频信号的光纤传输实验如何计算最佳静态工作点 音频光端机有什么特点? 光电转换器属于音视频设备吗? 音频光端机的基本信息 一般买数字同轴转光纤音频互转转换器,通常选择哪款好? 挑选数字同轴转光纤音频互转转换器,什么品牌好?