[英]Android 4.4 KitKat not receiving cookies
在我的應用程序中,我向服務器發送POST請求,並從服務器接收響應。 然后從響應中收集不同的Cookie,尤其是用戶信息。 因此,我發送登錄請求並在服務器響應后接收cookie,以保持登錄。 在Android 4.3及更低版本中,我收到的Cookie很好,並且用戶成功登錄。 但是在Android 4.4中,用戶成功登錄,但是沒有收到Cookie。
Android是否已對此進行了重大更改? 如果有人有任何建議,這是我的以下代碼。
private URL urlObj;
private HttpURLConnection connection;
private DataOutputStream dataOs;
private ArrayList<String> schools;
private ArrayList<Post> schoolPosts;
private String schoolID;
private String name;
private String userLoginCookie, sessionSeedCookie, sessionUidCookie, sPrefCookie;
private Context context;
private CookieStore store;
public DataParser(Context _context) {
context = _context;
}
//First call whenever connecting across the user's network
private void establishConnection() throws IOException {
urlObj = new URL(url);
connection = (HttpURLConnection) urlObj.openConnection();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(cookieManager);
store = cookieManager.getCookieStore();
getCookies();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("Cookie", sessionSeedCookie+";"+sessionUidCookie+";"+userLoginCookie+";"+sPrefCookie);
connection.setDoOutput(true);
connection.setUseCaches(false);
dataOs = new DataOutputStream(connection.getOutputStream());
}
//Called after communication is complete
private void disconnectAll() throws IOException {
connection.disconnect();
dataOs.close();
}
private void getCookies() {
SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
userLoginCookie = settings.getString(USER_LOGIN, BLANK);
Log.d(LOG, "Cookie: "+userLoginCookie);
sessionSeedCookie = settings.getString(SESS_SEED, BLANK);
Log.d(LOG, "Cookie: "+sessionSeedCookie);
sessionUidCookie = settings.getString(SESS_UID, BLANK);
Log.d(LOG, "Cookie: "+sessionUidCookie);
sPrefCookie = settings.getString(S_PREF, "sPref="+BLANK);
Log.d(LOG, "Cookie: "+sPrefCookie);
}
private void updateCookies() {
SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
List<HttpCookie> cookieList = store.getCookies();
for(int i=0; i<cookieList.size(); i++) {
if(cookieList.get(i).getName().equals(USER_LOGIN))
editor.putString(USER_LOGIN, cookieList.get(i).toString());
else if(cookieList.get(i).getName().equals(SESS_SEED))
editor.putString(SESS_SEED, cookieList.get(i).toString());
else if(cookieList.get(i).getName().equals(SESS_UID))
editor.putString(SESS_UID, cookieList.get(i).toString());
else
Log.d(LOG, "Found Extra Cookie: "+cookieList.get(i).getName());
}
sPrefCookie = settings.getString(S_PREF, "sPref="+BLANK);
editor.commit(); //Save changes to the SharedPreferences
}
//Logins User into Walkntrade
public String login(String email, String password) throws IOException {
establishConnection(); //Instantiate all streams and opens the connection
String query= "intent=login&password="+password+"&email="+email+"&rememberMe=true";
dataOs.writeBytes(query);
Log.d(LOG, "" + connection.getResponseCode());
updateCookies();
String response = readInputAsString(connection.getInputStream());
Log.d(LOG, "Connection Status: "+response);
disconnectAll();
return response;
}
//Logs user out of Walkntrade
public void logout() throws IOException {
establishConnection();
String query = "intent=logout";
dataOs.writeBytes(query);
Log.d(LOG, "" + connection.getResponseCode());
updateCookies();
disconnectAll();
}
//Returns user login status
public static boolean isUserLoggedIn(Context _context) {
SharedPreferences settings = _context.getSharedPreferences(PREFS_NAME, 0);
boolean isUserLoggedIn = settings.getBoolean(DataParser.CURRENTLY_LOGGED_IN, false);
return isUserLoggedIn;
}
public String getUserName() throws IOException{
establishConnection();
String query = "intent=getUserName";
dataOs.writeBytes(query);
Log.d(LOG, ""+connection.getResponseCode());
updateCookies();
String response = readInputAsString(connection.getInputStream());
disconnectAll();
return response;
}
public String getUserAvatar() throws IOException {
establishConnection();
String query = "intent=getAvatar";
dataOs.writeBytes(query);
Log.d(LOG, ""+connection.getResponseCode());
updateCookies();
String response = readInputAsString(connection.getInputStream());
disconnectAll();
return response;
}
我解決了這個問題。 我從HttpUrlConnection和其他java.net東西切換到AndroidHttpClient和其他Apache Http類。 現在可以從Android API 19中檢索Cookie。
[編輯]我使用了AndroidHttpClient( http://developer.android.com/reference/android/net/http/AndroidHttpClient.html ),並且遵循了一些Apache Http教程。 因此,在我稍微更改了代碼之后,它看起來像這樣:
private AndroidHttpClient httpClient; //Android Client, Uses User-Agent, and executes request
private HttpContext httpContext; //Contains CookieStore that is sent along with request
private CookieStore cookieStore; //Holds cookies from server
private HttpPost httpPost; //Contains message to be sent to client
private final String USER_AGENT = System.getProperty("http.agent"); //Unique User-Agent of current device
//First call whenever connecting across the user's network
private void establishConnection() {
cookieStore = new BasicCookieStore();
httpContext = new BasicHttpContext();
httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); //Attach CookieStore to the HttpContext
getCookies(); //Retrieve currently stored cookies
httpClient = AndroidHttpClient.newInstance(USER_AGENT);
httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
httpPost.setHeader("Cookie", sessionSeedCookie + ";" + sessionUidCookie + ";" + userLoginCookie + ";" + sPrefCookie);
}
//Called after communication is complete
private void disconnectAll() {
httpClient.close();
}
//Sends out POST request and returns an InputStream
private InputStream processRequest(String query) throws IOException{
httpPost.setEntity(new StringEntity(query)); //wraps the query into a String entity
HttpResponse response = httpClient.execute(httpPost, httpContext); //Executes the request along with the cookie store
Log.i(TAG, "Server Response Code: " + response.getStatusLine().getStatusCode()); //Reads response code from server
updateCookies();
return response.getEntity().getContent();
}
//Logins User into Walkntrade
public String login(String email, String password) throws IOException {
establishConnection(); //Instantiate all streams and opens the connection
String query= "intent=login&password="+password+"&email="+email+"&rememberMe=true";
InputStream inputStream = processRequest(query);
String serverResponse = readInputAsString(inputStream); //Reads message response from server
disconnectAll();
return serverResponse;
}
在KitKat 4.4更新之前,此代碼對我來說效果很好-
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//handle cookies
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
它在4.4.2之后崩潰了(至少在我注意到的時候),並且不再收到Cookie。 只需在打開urlConnection之前移動CookieManager和CookieHandler即可,再次對其進行了修復。 例如。
//handle cookies
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.