2014-03-24 59 views
0

在我的应用程序中,我向服务器发送POST请求,并从服务器接收响应。 从响应我收集不同的cookie,特别是用户信息。所以,我发送一个登录请求,并在服务器响应后接收cookie,以坚持登录。在Android 4.3及以下版本中,我收到的cookies很好,用户登录成功。但在Android 4.4中,用户成功登录,但没有收到cookie。Android 4.4 KitKat未收到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; 
} 

回答

0

我修复了这个问题。我从HttpUrlConnection和其他java.net的东西切换到AndroidHttpClient和其他Apache Http类。 Cookies现在从Android API 19检索。

[编辑] 我使用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; 
} 
+0

您能否详细说明一下?自4.4版破坏我的Cookie以来,我就遇到了这个问题 – WallyHale

+0

@WallyHale我添加了用于新实现的实际代码。我还注意到使用Apache客户端的速度有所提高。 – user3457562

0

此代码之前,奇巧的工作对我罚款4.4更新 -

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

//handle cookies 
CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

它4.4.2爆发后(在至少在我注意到它的时候),cookies不再被接收。在打开urlConnection之前简单地移动CookieManager和CookieHandler就可以修复它了。奇怪的是,它之前的工作!例如。

//handle cookies 
CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
相关问题