Управление сеансом Android
Существует ли определенная библиотека для управления сеансами Android? Мне нужно управлять своими сеансами в обычном приложении для Android. не в WebView
. Я могу установить сеанс из моего метода post. Но когда я отправляю другой запрос, этот сеанс потерян. Может ли кто-нибудь помочь мне в этом вопросе?
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("My url");
HttpResponse response = httpClient.execute(httppost);
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());
}
}
Когда я пытаюсь получить доступ к тому же хосту, который потерялся в сеансе:
HttpGet httpGet = new HttpGet("my url 2");
HttpResponse response = httpClient.execute(httpGet);
Я получаю тело ответа страницы входа в систему.
Ответы
Ответ 1
Это не имеет ничего общего с Android. Он имеет все, что связано с Apache HttpClient, библиотекой, которую вы используете для доступа HTTP.
Файлы cookie сеансов хранятся в вашем объекте DefaultHttpClient
. Вместо того, чтобы создавать новый DefaultHttpClient
для каждого запроса, удерживайте его и повторно его использовать, а cookie сеанса будет сохранен.
Вы можете прочитать об Apache HttpClient здесь и прочитать о управлении файлами cookie в HttpClient .
Ответ 2
Это то, что я использую для сообщений. Я могу использовать новый httpClients
с этим методом, где phpsessid
- это идентификатор сеанса PHP
, извлеченный из логина script, с использованием кода, который у вас выше.
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid));
Ответ 3
Как правило, в Java HttpURLConnection вы можете установить/получить cookie таким образом (вот и весь процесс подключения). Код, приведенный ниже, находится в моем запуске ConnectionThread(), из которого наследуются все классы активности подключения. Все используют общую статическую строку sCookie, которая отправляется со всеми запросами. Поэтому вы можете поддерживать общее состояние, например, войти в систему:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//set cookie. sCookie is my static cookie string
if(sCookie!=null && sCookie.length()>0){
conn.setRequestProperty("Cookie", sCookie);
}
// Send data
OutputStream os = conn.getOutputStream();
os.write(mData.getBytes());
os.flush();
os.close();
// Get the response!
int httpResponseCode = conn.getResponseCode();
if (httpResponseCode != HttpURLConnection.HTTP_OK){
throw new Exception("HTTP response code: "+httpResponseCode);
}
// Get the data and pass them to the XML parser
InputStream inputStream = conn.getInputStream();
Xml.parse(inputStream, Xml.Encoding.UTF_8, mSaxHandler);
inputStream.close();
//Get the cookie
String cookie = conn.getHeaderField("set-cookie");
if(cookie!=null && cookie.length()>0){
sCookie = cookie;
}
/* many cookies handling:
String responseHeaderName = null;
for (int i=1; (responseHeaderName = conn.getHeaderFieldKey(i))!=null; i++) {
if (responseHeaderName.equals("Set-Cookie")) {
String cookie = conn.getHeaderField(i);
}
}*/
conn.disconnect();
Ответ 4
Полностью прозрачный способ сохранения активности сеанса (входа пользователя или любого другого) в приложениях Android.
Он использует apache DefaultHttpClient внутри Singleton и HttpRequest/Response Interceptors.
Класс SessionKeeper просто проверяет, является ли один из заголовков Set-Cookie, и если да, то он просто запоминает его.
SessionAdder просто добавляет идентификатор сеанса к запросу (если не null).
Таким образом, весь процесс аутентификации полностью прозрачен.
public class HTTPClients {
private static DefaultHttpClient _defaultClient;
private static String session_id;
private static HTTPClients _me;
private HTTPClients() {
}
public static DefaultHttpClient getDefaultHttpClient(){
if ( _defaultClient == null ) {
_defaultClient = new DefaultHttpClient();
_me = new HTTPClients();
_defaultClient.addResponseInterceptor(_me.new SessionKeeper());
_defaultClient.addRequestInterceptor(_me.new SessionAdder());
}
return _defaultClient;
}
private class SessionAdder implements HttpRequestInterceptor {
@Override
public void process(HttpRequest request, HttpContext context)
throws HttpException, IOException {
if ( session_id != null ) {
request.setHeader("Cookie", session_id);
}
}
}
private class SessionKeeper implements HttpResponseInterceptor {
@Override
public void process(HttpResponse response, HttpContext context)
throws HttpException, IOException {
Header[] headers = response.getHeaders("Set-Cookie");
if ( headers != null && headers.length == 1 ){
session_id = headers[0].getValue();
}
}
}
}