Maintenir cookie de session dans Android
Bon, j'ai une application android qui a une forme, deux EditText, un spinner, et un bouton de connexion. L'utilisateur sélectionne le service de la fileuse, les types dans leur nom d'utilisateur et le mot de passe et clique sur connexion. Les données sont envoyées par la POSTE, une réponse est renvoyée, une manipulation, une nouvelle WebView est lancé, la chaîne html généré à partir de la réponse est chargé, et j'ai la page d'accueil de ce service que l'utilisateur a sélectionné.
Que tout est bien et bon. Maintenant, lorsque l'utilisateur clique sur un lien, les informations de connexion ne peut pas être trouvé, et la page de demande à l'utilisateur de se connecter à nouveau. Ma session est tombé quelque part, et je ne suis pas sûr de la façon de passer l'info à partir de la classe qui contrôle la partie principale de mon application à la classe qui vient de lance de la webview activité.
Le onClick gestionnaire de la forme bouton de connexion:
private class FormOnClickListener implements View.OnClickListener {
public void onClick(View v) {
String actionURL, user, pwd, user_field, pwd_field;
actionURL = "thePageURL";
user_field = "username"; //this changes based on selections in a spinner
pwd_field = "password"; //this changes based on selections in a spinner
user = "theUserLogin";
pwd = "theUserPassword";
List<NameValuePair> myList = new ArrayList<NameValuePair>();
myList.add(new BasicNameValuePair(user_field, user));
myList.add(new BasicNameValuePair(pwd_field, pwd));
HttpParams params = new BasicHttpParams();
DefaultHttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost(actionURL);
HttpResponse response = null;
BasicResponseHandler myHandler = new BasicResponseHandler();
String endResult = null;
try { post.setEntity(new UrlEncodedFormEntity(myList)); }
catch (UnsupportedEncodingException e) { e.printStackTrace(); }
try { response = client.execute(post); }
catch (ClientProtocolException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
try { endResult = myHandler.handleResponse(response); }
catch (HttpResponseException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
List<Cookie> cookies = client.getCookieStore().getCookies();
if (!cookies.isEmpty()) {
for (int i = 0; i < cookies.size(); i++) {
cookie = cookies.get(i);
}
}
Intent myWebViewIntent = new Intent(MsidePortal.this, MyWebView.class);
myWebViewIntent.putExtra("htmlString", endResult);
myWebViewIntent.putExtra("actionURL", actionURL);
startActivity(myWebViewIntent);
}
}
Et voici la WebView classe qui gère l'affichage de la réponse:
public class MyWebView extends android.app.Activity {
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.web);
MyWebViewClient myClient = new MyWebViewClient();
WebView webview = (WebView)findViewById(R.id.mainwebview);
webview.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebViewClient(myClient);
Bundle extras = getIntent().getExtras();
if(extras != null)
{
//Get endResult
String htmlString = extras.getString("htmlString");
String actionURL = extras.getString("actionURL");
Cookie sessionCookie = MsidePortal.cookie;
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
if (sessionCookie != null) {
cookieManager.removeSessionCookie();
String cookieString = sessionCookie.getName()
+ "=" + sessionCookie.getValue()
+ "; domain=" + sessionCookie.getDomain();
cookieManager.setCookie(actionURL, cookieString);
CookieSyncManager.getInstance().sync();
}
webview.loadDataWithBaseURL(actionURL, htmlString, "text/html", "utf-8", actionURL);}
}
}
}
J'ai eu un succès mitigé mise en œuvre de ce cookie solution. Cela semble fonctionner pour un service que je connecter que je sais conserve les cookies sur le serveur (ancien, archaïque, mais il fonctionne et qu'ils ne veulent pas changer.) Le service, je suis d'essayer maintenant, l'utilisateur à garder les cookies sur leur ordinateur local, et il ne fonctionne pas avec cette configuration.
Des suggestions?
OriginalL'auteur datguywhowanders | 2010-06-14
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de garder le cookie à partir d'un appel à l'autre. Au lieu de créer un nouveau DefaultHttpClient, utilisez ce constructeur:
Et de garder le Constructeur de la classe comme un champ de votre application.
La réponse est spécifique à Apache HttpClient (qui était le client). Oui, le HttpClient est déprécié depuis la Guimauve. developer.android.com/about/versions/marshmallow/... Répondre à la même question pour
java.net
classes ici serait complètement hors-sujet.Pouvez-vous me guider à certaines ressources ou de l'extrait de code pour mettre en œuvre cette solution dans mon projet avec la dernière version de l'api?
OriginalL'auteur rds
Vous pouvez stocker les cookies dans une commune de la préférence et de la charge selon les besoins dans d'autres activitys.
Ou essayez cette idée à partir d'un question similaire.
OriginalL'auteur Christoph Haefner
L'utiliser dans l'url de connexion de l'Activité
OriginalL'auteur suraj jain
ne sais pas si vous avez encore besoin d'une réponse, mais encore une fois voici quelques informations supplémentaires qui peuvent aider à
si vous voulez garder les cookies synchronisé
et si vous voulez effacer les Cookies
OriginalL'auteur guleryuz
Lors de toute nouvelle activité est lancé (donc je suppose que c'est le même lorsque vous lancez une nouvelle webview) c'est en effet le lancement d'un nouveau programme à partir de zéro. Cette nouvelle activité n'aura pas accès aux données à partir de toute activité précédente (à moins que les données sont transmises en étant attaché à l'intention).
2 solutions possibles:
1) putExtra ne peut être utilisé pour la transmission de données primitifs, donc, pour passer à quelque chose de plus complexe, vous devez soit
a) Envelopper la structure plus complexe dans une classe qui implémente l'
L'interface Parcelable, qui peut être stocké dans une supplémentaire.
b) Synthèse de la structure plus complexe dans une classe qui implémente l'
L'interface Serializable, qui peut être stocké dans une supplémentaire.
Une de ces approches est assez compliqué et un peu juste du travail.
2), Personnellement, je préfère de loin l'approche suggérée par rds. Pour préciser, quand rds dit:
Je crois qu'il veut étendre l'application de la classe. Toutes les propriétés qui y sont stockées sont disponibles au niveau mondial pour toutes les activités.
Cet article explique très clairement comment faire ceci:
http://www.screaming-penguin.com/node/7746
Vous pouvez ignorer les choses à propos de l'AsyncTask (même si je suis sûr que vous trouverez une nécessité pour qu'à un certain point) et juste se concentrer sur la partie concernant l'extension de la classe d'application.
OriginalL'auteur Dan
J'ai ce problème similaire plusieurs semaines, c'est parce que vous créez new DefaultHttpClient chaque fois que vous cliquez sur le bouton.. essayez de créer un DefaultHttpClient, et en utilisant la même DefaultHttpClient pour chaque demande, vous essayez d'envoyer. il a résolu mon problème
DefaultHttpClient
lorsque vous avez juste besoin de le cookie.OriginalL'auteur Hendra
Vous avez utilisé cette ligne -
Afin de garantir la réception d'un nouveau cookie à chaque fois.
Semble que vous ayez passé par le même problème que j'ai rencontrés, découvrez ci-dessous le lien -
removeSessionCookie() problème d'android (le code.google.,com)
il est dit que
removeSessionCookie()
est mis en œuvre dans un thread, chaque fois qu'il est appelé; un thread démarre et après votresetCookie(url, cookieString);
est appelé, il supprime les nouvelles de cookie que vous venez de définir.Ainsi, pour certains appareils, il fonctionne bien comme
removeSessionCookie()
est déjà exécuté, tandis que, pour certains, il supprimer le cookie, et nous avons ce problème.Je vous suggère de supprimer cette
removeSessionCookie();
que vous définissez un seul cookie, afin de ne pas entrer en conflit avec d'autres cookies. Votre code fonctionne parfaitement.OriginalL'auteur Darpan
Sever utiliser le sessionID stockées dans les cookies pour identifier le spécifique de l'utilisateur.Chaque langue a une autre sessionID nom dans les en-têtes http.Vous pouvez utiliser un outil de réseau ou d'un navigateur pour voir quel est le nom de l'id de session appelée.
Et d'autre moyen,je SUPPOSE,le facebook et twitter de manière,de vous retirer toutes les session de code, c'est l'utilisation du serveur Jeton d'Accès pour identifier un utilisateur.
Suis-je clair?
OriginalL'auteur tsingroo