[JAVA] SetCookie von der Client-Seite mit OkHttp3

Aufgabe

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

Vorwort

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

Lösung

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.

Beispielcode


		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();

Quellcode für die Hilfsklasse

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);
	}

}

Veröffentlichungsziel

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

SetCookie von der Client-Seite mit OkHttp3
So deaktivieren Sie Set-Cookie über die API auf der Vorderseite
API-Integration von Java mit Jersey Client
Fügen Sie das Selenium-Cookie in den okHttp3-Client ein
[Java] Stellen Sie die Zeit im Browser mit jsoup ein
Feder mit Kotorin ―― 3. Auslassen von Wellenklammern aus der Funktion
Lassen Sie das Armbandgerät mit Bluetooth über die Android-App vibrieren
Suchen Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java
[MT] Geben Sie die Artikelkategorie von Android mit Daten-API an
Stellen Sie Datum und Uhrzeit aus der Zeichenfolge mit POI ein
[MT] Geben Sie die Artikelkategorie von Android mit Daten-API an