Bei der Kommunikation mit Android auf dem Server (HTTP-Basis) wird aufgrund des Komforts des Servers und auf der Android-Seite mit OkHttp3 (http://square.github.io/okhttp/) die Anforderung gestellt, das Cookie auf der Android-Clientseite zu setzen. Ich dachte darüber nach, wie ich Cookie einstellen soll.
Bibliothek verwendet ok http / 3.6.0
Als ich bereits nach einer Lösung suchte, gab es einige ähnliche Themen, die sich jedoch geringfügig von dem unterschieden, wonach ich suchte (oder die nicht gelöst werden konnten). Deshalb habe ich beschlossen, sie selbst zu erstellen.
--OkHttp3 Cookie-Behandlung und Persistenz https://github.com/franmontiel/PersistentCookieJar
Ich habe eine Hilfsklasse namens ** OkHttp3CookieHelper ** erstellt. Im Folgenden wird der Client gezwungen, ein eigenes Cookie zu setzen. Natürlich werden auch andere vom Server ausgegebene Cookies behandelt. Wenn Sie einen Persistenzmechanismus benötigen, fügen Sie ihn hinzu. Derzeit scheint es kein Problem mit dem On-Memory zu geben.
Der folgende Code ist plattformunabhängig und funktioniert sowohl mit Pure Java als auch mit Android.
String url = "https://example.com/webapi";
OkHttp3CookieHelper cookieHelper = new OkHttp3CookieHelper();
cookieHelper.setCookie(url, "cookie_name", "cookie_value");
OkHttpClient client = new OkHttpClient.Builder()
.cookieJar(cookieHelper.cookieJar())
.build();
Request request = new Request.Builder()
.url(url)
.build();
OkHttp3CookieHelper.java
public class OkHttp3CookieHelper {
private final Map<String, List<Cookie>> mServerCookieStore = new ConcurrentHashMap<String, List<Cookie>>();
private Map<String, List<Cookie>> mClientCookieStore = new ConcurrentHashMap<String, List<Cookie>>();
private final CookieJar mCookieJar = new CookieJar() {
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> serverCookieList = mServerCookieStore.get(url.host());
if (serverCookieList == null) {
serverCookieList = new ArrayList<Cookie>();
}
final List<Cookie> clientCookieStore = mClientCookieStore.get(url.host());
if (clientCookieStore != null) {
serverCookieList.addAll(clientCookieStore);
}
return serverCookieList != null ? serverCookieList : new ArrayList<Cookie>();
}
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> unmodifiableCookieList) {
mServerCookieStore.put(url.host(), new ArrayList<Cookie>(unmodifiableCookieList));
}
};
public void setCookie(String url, Cookie cookie) {
final String host = HttpUrl.parse(url).host();
List<Cookie> cookieListForUrl = mClientCookieStore.get(host);
if (cookieListForUrl == null) {
cookieListForUrl = new ArrayList<Cookie>();
mClientCookieStore.put(host, cookieListForUrl);
}
putCookie(cookieListForUrl, cookie);
}
public void setCookie(String url, String key, String value) {
final HttpUrl httpUrl = HttpUrl.parse(url);
setCookie(url, Cookie.parse(httpUrl, key + "=" + value));
}
public void setCookie(HttpUrl httpUrl, String key, String value) {
setCookie(httpUrl.host(), Cookie.parse(httpUrl, key + "=" + value));
}
public CookieJar cookieJar() {
return mCookieJar;
}
private void putCookie(List<Cookie> storedCookieList, Cookie newCookie) {
Cookie oldCookie = null;
for (Cookie storedCookie : storedCookieList) {
// create key for comparison
final String oldCookieKey = storedCookie.name() + storedCookie.path();
final String newCookieKey = newCookie.name() + newCookie.path();
if (oldCookieKey.equals(newCookieKey)) {
oldCookie = storedCookie;
break;
}
}
if (oldCookie != null) {
storedCookieList.remove(oldCookie);
}
storedCookieList.add(newCookie);
}
}
Der Code wird unten veröffentlicht
github https://github.com/riversun/okhttp3-cookie-helper
gradle compile 'org.riversun:okhttp3-cookie-helper:1.0.1'
maven
<dependency>
<groupId>org.riversun</groupId>
<artifactId>okhttp3-cookie-helper</artifactId>
<version>1.0.1</version>
</dependency>
Recommended Posts