Android-User Posté(e) 29 avril 2011 Share Posté(e) 29 avril 2011 Bonjour, Je suis en train de coder une page de connexion pour accéder à mon application J'utilise également mon serveur (internet) avec du PHP pour gérer les authentications et les $_SESSION. En résumé, je vérifie si les données sont justes, pour cela, j'utilise la méthode POST via mon java, puis je redirige l'utilisateur sur une autre activité. Mon problème est que si les logins sont correctes, la $_SESSION n'est pas active sur mon application, hors sur internet, cela fonctionne bien... Serais-ce à cause de la non gestion des cookies de mon activité ? Petite précision : j'ai utilisé une webview, mais cela ne change rien, toujours le même problème... (inutile). package com.antho.main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.EditText; import android.widget.Toast; public class Login extends Activity implements OnClickListener { /** Called when the activity is first created. */ WebView myWebView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); View continueButton = findViewById(R.id.connexion); continueButton.setOnClickListener(this); myWebView = (WebView) findViewById(R.id.mywebview); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.setWebViewClient(new HelloWebViewClient()); } @Override public void onClick(View v) { //Intent i; switch (v.getId()) { case R.id.connexion: EditText email = (EditText) findViewById(R.id.email); String emailStr = email.getText().toString(); EditText password = (EditText) findViewById(R.id.password); String passwordStr = password.getText().toString(); //String mUsername = username.getText().toString(); //String mPassword = password.getText().toString(); if (checkInternetConnection() == false) { // Vérifier la connexion. return; } Pattern p = Pattern.compile(".+@.+\\.[a-z]+"); Matcher m = p.matcher(emailStr); // Compare avec pattern if (m.matches() == false) { Toast.makeText(Login.this, emailStr + " n'est pas une adresse email.",Toast.LENGTH_SHORT).show(); return; } // Si les champs sont vides if (passwordStr.equals("")) { Toast.makeText(Login.this, "Ajouter votre mot de passe.",Toast.LENGTH_SHORT).show(); return; } tryLogin(emailStr, passwordStr); // On vérifie les données if (m.matches() == true & !passwordStr.equals("")) { //Uri link = Uri.parse("http://www.monsite.org/login?email=" + emailStr + "&password=" + passwordStr); //Intent intent = new Intent(Intent.ACTION_VIEW, link); //startActivity(intent); Intent i = new Intent(Login.this, Main.class); i.putExtra("email", emailStr); i.putExtra("password", passwordStr); startActivity(i); break; } } } private boolean checkInternetConnection() { ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); if ( conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED || conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED ) { Log.v("Congr","Connection Present"); return true; } else { Log.v("conMgr"," No Connection"); Toast.makeText(Login.this, "You are not connected.",Toast.LENGTH_LONG).show(); return false; } } public void tryLogin(String email, String password) { HttpURLConnection connection; OutputStreamWriter request = null; URL url = null; String response = null; String parameters = "mail="+email+"&password="+password; try { myWebView.loadUrl("http://monsite.org/webapp/"); url = new URL("http://monsite.org/webapp/"); connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "text/plain; charset=utf-8"); connection.setRequestMethod("POST"); request = new OutputStreamWriter(connection.getOutputStream()); request.write(parameters); request.flush(); request.close(); String line = ""; InputStreamReader isr = new InputStreamReader(connection.getInputStream()); BufferedReader reader = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } response = sb.toString(); String[] response_splitted = TextUtils.split(response, "<!DOCTYPE"); //Toast.makeText(this,"Message from Server: \n"+ response, 0).show(); Toast.makeText(this, response_splitted[0],Toast.LENGTH_LONG).show(); if(response_splitted[0].equals("ok")) { String validation = "ok"; } else { String validation = "no"; return; } isr.close(); reader.close(); return; } catch(IOException e) { // Error return; } } private class HelloWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } } Merci d'avance ! :D Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 mai 2011 Share Posté(e) 2 mai 2011 Il faut effectivement que tu récupères le/les cookies positionnés par ton serveur lors de l'authentification, pour pouvoir les passer ensuite aux requêtes suivantes, afin que ton serveur retrouve ses petits. Tu n'es pas obligé de les gérer à la main, utilise pour cela CookieManager Lien vers le commentaire Partager sur d’autres sites More sharing options...
Android-User Posté(e) 2 mai 2011 Auteur Share Posté(e) 2 mai 2011 Rebonjour, Merci de m'avoir répondu, je ne vois pas du tout comment faire mon (web) service pour gérer les cookies de mon application... L'idée étant d'enregistrer les cookies de Login.java et de les exploiter dans Web.java afin de conserver ma session PHP. Ne serais-ce pas plus facile et optimiser d'éviter un service avec librairie ? Voici comment je me suis pris pour les cookies de mon activité Login. HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.monsite.com/index.php"); try { BasicCookieStore cookieStore = new BasicCookieStore(); HttpContext localContext = new BasicHttpContext(); localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); // Data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("mail", email)); nameValuePairs.add(new BasicNameValuePair("password", password)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Post Request HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); // new in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String result = sb.toString(); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); Toast.makeText(this, "Response content length: " + entity.getContentLength(),Toast.LENGTH_LONG).show(); } List<Cookie> cookies = cookieStore.getCookies(); for (int i = 0; i < cookies.size(); i++) { System.out.println("Local cookie: " + cookies.get(i)); Toast.makeText(this, "Local cookie: " + cookies.get(i),Toast.LENGTH_LONG).show(); } }catch (ClientProtocolException e) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } finally { httpclient.getConnectionManager().shutdown(); } return false; Est-ce que tu pourrais me donner quelques astuces, je ne sais pas c'est suffisant pour cette classe :S Et qu'en est-il donc pour mon Web activity, quelque chose comme ceci ? DefaultHttpClient mClient = new DefaultHttpClient(); CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().startSync(); Cookie sessionInfo; List cookies = mClient.getCookieStore().getCookies(); Un grand merci d'avance ! Et bon weekend :D Lien vers le commentaire Partager sur d’autres sites More sharing options...
Android-User Posté(e) 4 mai 2011 Auteur Share Posté(e) 4 mai 2011 Il faut effectivement que tu récupères le/les cookies positionnés par ton serveur lors de l'authentification, pour pouvoir les passer ensuite aux requêtes suivantes, afin que ton serveur retrouve ses petits. Tu n'es pas obligé de les gérer à la main, utilise pour cela CookieManager Rebonjour, j'ai essayé avec ce bout de code dans le même code (login.java) pour stocker les cookies (j'ai utilisé HttpClient et la méthode POST) CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().startSync(); Ensuite, je dois pouvoir les réutiliser dans une autre activité nommée (webview.class) pour récupérer le cookie concernant la Session PHP. Et là je suis bloqué... Merci d'avance ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 5 mai 2011 Share Posté(e) 5 mai 2011 Tu peux implémenter un Service (cf doc, "Service local") qui regroupera tous les traitements liés à la communication réseau, et que tes Activities appelleront en fonction de leurs besoins Lien vers le commentaire Partager sur d’autres sites More sharing options...
Android-User Posté(e) 7 mai 2011 Auteur Share Posté(e) 7 mai 2011 Rebonjour, Merci de m'avoir répondu ! Je ne vois pas du tout comment faire un (web service) pour gérer les cookies... Mon idée étant de stocker les cookies de Login.java et de les conserver et réutiliser dans ma classe Web.java pour exploiter ma Session PHP ! J'ai essayé de cette manière pour enregistrer les cookies de Login.java. HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.monsite.com/index.php"); try { BasicCookieStore cookieStore = new BasicCookieStore(); HttpContext localContext = new BasicHttpContext(); localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); // Data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("mail", email)); nameValuePairs.add(new BasicNameValuePair("password", password)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Post Request HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); // new in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String result = sb.toString(); String[] result_splitted = TextUtils.split(result, "<!DOCTYPE"); Toast.makeText(this, result_splitted[0],Toast.LENGTH_LONG).show(); System.out.println(response.getStatusLine()); if (entity != null) { Toast.makeText(this, "Response content length: " + entity.getContentLength(),Toast.LENGTH_LONG).show(); } List<Cookie> cookies = cookieStore.getCookies(); for (int i = 0; i < cookies.size(); i++) { Toast.makeText(this, "Local cookie: " + cookies.get(i),Toast.LENGTH_LONG).show(); } }catch (ClientProtocolException e) { // TODO Auto-generated catch block } catch (IOException e) { // TODO Auto-generated catch block } finally { httpclient.getConnectionManager().shutdown(); } return false; Je ne sais pas si c'est suffisant ? Et concernant mon activité Web : DefaultHttpClient mClient = new DefaultHttpClient(); CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().startSync(); Cookie sessionInfo; List cookies = mClient.getCookieStore().getCookies(); Je suis assez perdu... Un grand merci d'avance ! Et bon weekend ! :D Lien vers le commentaire Partager sur d’autres sites More sharing options...
Android-User Posté(e) 13 mai 2011 Auteur Share Posté(e) 13 mai 2011 Est-ce que quelqu'un pourrait m'aider, je ne trouve aucune solution ou je n'y arrive pas... Merci d'avance Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.