我正在尝试添加带有GUID的cookie来识别用户,但是当我在测试脚本上运行时,我的代码似乎没有发送任何cookie。
我的Java代码:
public void search(String q, int o) {
final String query = q;
final int offset = o;
Thread searchThread = new Thread() {
public void run() {
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
BasicHttpContext httpContext = new BasicHttpContext();
CookieStore cookieStore = new BasicCookieStore();
httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
cookieStore.addCookie(new BasicClientCookie("remixsid", guid));
httpClient.setCookieStore(cookieStore);
HttpPost httpPost = new HttpPost("http://192.168.1.43/test/test.php?section=audio&q=" + URLEncoder.encode(query, HTTP.UTF_8) + "&offset=" + offset);
//HttpPost httpPost = new HttpPost("http://vkontakte.ru/gsearch.php?section=audio&q=" + URLEncoder.encode(query, HTTP.UTF_8) + "&offset=" + offset);
HttpResponse response = httpClient.execute(httpPost, httpContext);
String responseBody = EntityUtils.toString(response.getEntity());
System.out.print(responseBody);
} catch(Exception e) {
System.out.println(e.toString());
}
}
};
searchThread.run();
}
我测试Cookie的PHP代码:
<?php
$cookies = $_COOKIE;
if(!count($cookies) > 0)
echo 'No cookies!';
foreach ($cookies as $key=>$val)
echo "$key--> $val";
?>
使用以下代码检索GUID:
public void login(String usr, String pass) {
logout();
final String username = usr;
final String password = pass;
Thread loginThread = new Thread() {
public void run() {
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://login.vk.com/?act=login&email=" + URLEncoder.encode(username, HTTP.UTF_8) + "&pass=" + URLEncoder.encode(password, HTTP.UTF_8));
httpClient.execute(httpPost);
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
for(Cookie cookie : cookies) {
System.out.println("Cookie: " + cookie.toString());
if(cookie.getName().contains("remixsid"))
guid = cookie.getValue();
}
} catch(Exception e) {
System.out.println(e.toString());
System.out.println("An error occured");
if(loginHandler != null)
loginHandler.onLoginError(e);
return;
}
if(!isLoggedIn()) {
System.out.println("User credentials invalid");
if(loginHandler != null)
loginHandler.onLoginInvalidCredentials();
return;
}
if(loginHandler != null)
loginHandler.onLoginSuccess();
System.out.println("Login successfull GUID is: " + guid);
}
};
loginThread.start();
}
答案 0 :(得分:6)
手动设置cookie标头似乎有用......
public void search(String q, int o) {
final String query = q;
final int offset = o;
Thread searchThread = new Thread() {
public void run() {
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://192.168.1.43/test/test.php");
//HttpPost httpPost = new HttpPost("http://vkontakte.ru/gsearch.php?section=audio&q=" + URLEncoder.encode(query, HTTP.UTF_8) + "&offset=" + offset);
httpPost.setHeader("Cookie", "remixsid=" + guid);
HttpResponse response = httpClient.execute(httpPost);
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println(responseBody);
} catch(Exception e) {
System.out.println(e.toString());
}
}
};
searchThread.start();
}
答案 1 :(得分:2)
很少有意见和建议:
BasicClientCookie.setPath()
方法。/
)时,只有所有其他服务器端程序可用。 编辑:
我错过了域名部分。您还需要设置cookie域。假设您的PHP脚本在http://mysite/myscript.php
运行,mysite
就是域(如果您在本地框中运行脚本,则可能是localhost
)。使用BasicClientCookie.setDomain()
设置Cookie域。
要理解这一点,假设您的http-client lib作为浏览器与网站交互。浏览器存储来自许多站点的cookie,但在向特定站点发出请求时,它仅发送从该特定站点收到的cookie。
如果未设置域,则lib不会将cookie发送到该主机。