我想在正确处理cookie的同时向远程服务器发出http请求(例如,存储服务器发送的cookies,并在我发出后续请求时发送这些cookies )。保留任何和所有的cookie是很好的,但实际上我唯一关心的是会话cookie。
对于java.net,实现这一点的首选方法似乎是使用java.net.CookieHandler (抽象基类)和java.net.CookieManager (具体实现)。安卓有java.net.CookieHandler,但它似乎没有java.net.CookieManager。
我可以通过检查http头文件来手动编写代码,但似乎必须有一种更简单的方法。
在Android上发出http请求同时保留cookie的正确方式是什么?
发布于 2009-03-26 20:28:16
事实证明,谷歌安卓是与ApacheLogon4.0一起发布的,我能够通过使用HttpClient docs中的“基于表单的登录”示例来了解如何做到这一点
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
/**
* A example that demonstrates how HttpClient APIs can be used to perform
* form-based logon.
*/
public class ClientFormLogin {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("https://portal.sun.com/portal/dt");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println("Login form get: " + response.getStatusLine());
if (entity != null) {
entity.consumeContent();
}
System.out.println("Initial set of cookies:");
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
System.out.println("None");
} else {
for (int i = 0; i < cookies.size(); i++) {
System.out.println("- " + cookies.get(i).toString());
}
}
HttpPost httpost = new HttpPost("https://portal.sun.com/amserver/UI/Login?" +
"org=self_registered_users&" +
"goto=/portal/dt&" +
"gotoOnFail=/portal/dt?error=true");
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("IDToken1", "username"));
nvps.add(new BasicNameValuePair("IDToken2", "password"));
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
entity = response.getEntity();
System.out.println("Login form get: " + response.getStatusLine());
if (entity != null) {
entity.consumeContent();
}
System.out.println("Post logon cookies:");
cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
System.out.println("None");
} else {
for (int i = 0; i < cookies.size(); i++) {
System.out.println("- " + cookies.get(i).toString());
}
}
// When HttpClient instance is no longer needed,
// shut down the connection manager to ensure
// immediate deallocation of all system resources
httpclient.getConnectionManager().shutdown();
}
}
发布于 2014-04-12 00:45:23
cookie只是另一个HTTP标头。您总是可以在使用Apache库或HTTPUrlConnection进行HTTP调用时设置它。无论采用哪种方式,您都应该能够以这种方式读取和设置HTTP cookie。
你可以阅读this article了解更多信息。
我可以分享我的安宁代码来演示你是多么容易做到这一点。
public static String getServerResponseByHttpGet(String url, String token) {
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
get.setHeader("Cookie", "PHPSESSID=" + token + ";");
Log.d(TAG, "Try to open => " + url);
HttpResponse httpResponse = client.execute(get);
int connectionStatusCode = httpResponse.getStatusLine().getStatusCode();
Log.d(TAG, "Connection code: " + connectionStatusCode + " for request: " + url);
HttpEntity entity = httpResponse.getEntity();
String serverResponse = EntityUtils.toString(entity);
Log.d(TAG, "Server response for request " + url + " => " + serverResponse);
if(!isStatusOk(connectionStatusCode))
return null;
return serverResponse;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
发布于 2009-03-24 20:01:20
我不使用谷歌android,但我想你会发现让它工作并不那么难。如果您阅读the relevant bit of the java tutorial,您将看到注册的cookiehandler从HTTP码获得回调。
所以如果没有默认值(你有没有检查过CookieHandler.getDefault()
是否真的是空的?)然后,您可以简单地扩展CookieHandler,实现put/get,并使其几乎自动工作。如果你走这条路,一定要考虑并发访问等问题。
编辑:显然,您必须通过CookieHandler.setDefault()
将自定义实现的一个实例设置为默认处理程序,以接收回调。忘了提这件事了。
https://stackoverflow.com/questions/678630
复制相似问题