androidでのcookieManagerを使ったクッキーの保存
やりたいこと
Androidからウェブサーバーにpostリクエストをし、
クッキーを保存するようなアプリを作ろうとしています。
(postのパラメータは、未実装です)
アクティビティを破棄しなければ、下記のコードでクッキーを保存し、渡すことができました。
ただ、一度アプリを落とすとクッキーが消えてしまっています。
色々と調べてみましたが、原因がよく分かりません。
sharedPreferencesなどに保存して、毎回取り出す必要があるのでしょうか。
Androidは初心者ですが、ご教授いただけると幸いです。
よろしくお願いいたします。
コード
package com.example.test;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Map;
public class HttpResponsAsync extends AsyncTask < Void, Void, String > {
private TextView textView;
static final String COOKIES_HEADER = "Set-Cookie";
static java.net.CookieManager msCookieManager = new java.net.CookieManager();
private Context context = null;
private ProgressDialog dialog = null;
private String title;
private String msg;
/**
* コンストラクタ
*/
public HttpResponsAsync(Context context) {
super();
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// doInBackground前処理
}
@Override
protected String doInBackground(Void...params) {
String readSt = null;
HttpURLConnection con = null;
URL url = null;
String urlSt = "https://URL.com";
try {
// URLの作成
url = new URL(urlSt);
// 接続用HttpURLConnectionオブジェクト作成
con = (HttpURLConnection) url.openConnection();
if (msCookieManager.getCookieStore().getCookies().size() > 0) {
//While joining the Cookies, use ',' or ';' as needed. Most of the server are using ';'
con.setRequestProperty("Cookie",
TextUtils.join(";", msCookieManager.getCookieStore().getCookies()));
}
// リクエストメソッドの設定
con.setRequestMethod("POST");
// リダイレクトを自動で許可しない設定
con.setInstanceFollowRedirects(false);
// URL接続からデータを読み取る場合はtrue
con.setDoInput(true);
// URL接続にデータを書き込む場合はtrue
con.setDoOutput(true);
// 接続
con.connect();
Map < String, List < String >> headerFields = con.getHeaderFields();
List < String > cookiesHeader = headerFields.get(COOKIES_HEADER);
if (cookiesHeader != null) {
for (String cookie: cookiesHeader) {
msCookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0));
}
}
InputStream in = con.getInputStream();
readSt = readInputStream( in );
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return readSt;
}
public String readInputStream(InputStream in ) throws IOException,
UnsupportedEncodingException {
StringBuffer sb = new StringBuffer();
String st = "";
BufferedReader br = new BufferedReader(new InputStreamReader( in , "UTF-8"));
while ((st = br.readLine()) != null) {
sb.append(st);
}
try { in .close();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// doInBackground後処理
JSONArray jsonArray = null;
try {
// 配列を取得する場合
jsonArray = new JSONObject(result).getJSONArray("data");
int count = jsonArray.length();
JSONObject[] bookObject = new JSONObject[count];
for (int i = 0; i < count; i++) {
bookObject[i] = jsonArray.getJSONObject(i);
// String型の場合
String st = bookObject[i].getString("type");
}
} catch (JSONException e) {
}
}
}