Login auf passwortgeschützer Seite

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Login auf passwortgeschützer Seite

    Hey :-[ ,

    da ich noch ein ziemlicher Android Anfänger bin stehe ich mal wieder vor einem Problem. :-X

    Und zwar bastel ich gerade an einem Login auf einer Website. Ich wollte gerne, dass die APP sich automatisch auf dieser Seite einloggt. Ich habe jetzt mal ein wenig im Internet gesucht und auch was gefunden, nur es funktioniert noch nicht richtig.

    Zu der Seite: Ich muss mich via Post Methode dort einloggen.

    HTML-Quellcode

    1. <form>action="index.php" method="POST">
    2. <table>
    3. <tr>
    4. <th class="topLine">Benutzername:</th>
    5. <td class="tbrom"><input type="text" name="id" maxlength="16" size="20"/></td>
    6. </tr>
    7. <tr>
    8. <th class="topLine">Passwort:</th>
    9. <td class="tbrom"><input type="password" name="password" maxlength="16" size="20"/></td>
    10. </tr>
    11. <tr>
    12. <td class="topLine" style="text-align:center;" colspan="2"><input type="submit" name="submit" value="login"/></td>
    13. </tr>
    14. </table>
    15. </form>
    Alles anzeigen


    Ich habe es jetzt schonmal versucht nur bekomme ich immer: android.os.NetworkOnMainThreadException
    So jetzt habe ich gelesen, dass ich um den Fehler zu umgehen ein Asynctask benutzen muss. Nur weiß ich jetzt nicht genau, wie ich die beiden Sachen kombiniere :(

    Hier mal meine Post Methode:

    Quellcode

    1. public void postData() {
    2. // Create a new HttpClient and Post Header
    3. HttpClient httpclient = new DefaultHttpClient();
    4. HttpPost httppost = new HttpPost("https://example.com/");
    5. try {
    6. // Add your data
    7. List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    8. nameValuePairs.add(new BasicNameValuePair("userid", "idexample"));
    9. nameValuePairs.add(new BasicNameValuePair("userpass", "passexample"));
    10. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    11. HttpResponse response = httpclient.execute(httppost);
    12. } catch (ClientProtocolException e) {
    13. // TODO Auto-generated catch block
    14. } catch (IOException e) {
    15. // TODO Auto-generated catch block
    16. }
    17. }
    Alles anzeigen


    und hier mein Asynctask.

    Java-Quellcode

    1. final Context context = this;
    2. @Override
    3. public void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_main);
    6. }
    7. private class LoadWebPageASYNC extends AsyncTask<String, Void, String> {
    8. @Override
    9. protected String doInBackground(String... urls) {
    10. WebView webView = (WebView) findViewById(R.id.webView);
    11. webView.getSettings().setJavaScriptEnabled(true);
    12. webView.loadUrl(urls[0]);
    13. // Create a new HttpClient and Post Header
    14. HttpClient httpclient = new DefaultHttpClient();
    15. HttpPost httppost = new HttpPost("www.example.com");
    16. try {
    17. // Add your data
    18. List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    19. nameValuePairs.add(new BasicNameValuePair("userid", "idexample"));
    20. nameValuePairs.add(new BasicNameValuePair("userpass", "passexample"));
    21. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    22. // Execute HTTP Post Request
    23. HttpResponse response = httpclient.execute(httppost);
    24. } catch (ClientProtocolException e) {
    25. // TODO Auto-generated catch block
    26. } catch (IOException e) {
    27. // TODO Auto-generated catch block
    28. }
    29. return null;
    30. }
    31. @Override
    32. protected void onPostExecute(String result) {
    33. }
    34. }
    35. public void readWebpage(View view) {
    36. LoadWebPageASYNC task = new LoadWebPageASYNC();
    37. task.execute(new String[] { "http://www.example.com" });
    38. }
    Alles anzeigen


    Gruß
    Evoh O:-)
  • Als funktionierend bekannte Codeschnipsel von anderen Entwicklern kopieren ist prinzipiell ein guter Plan, weil effizient;
    nicht gut ist allerdings, den Code "unbesehen" zu übernehmen, also nicht zu versuchen, diesen zu verstehen :)

    Beim Überfliegen deiner Schnipsel fällt direkt folgendes auf:
    - die "webview" Zeilen haben im Task nichts verloren, auf UI Elemente darf nur der UI-Thread zugreifen
    - den "post" Code hast du wohl unvollständig kopiert, da du mit "response" nichts weiter anstellst

    Grundsätzlich zu korrigieren:
    - das webview Zeug gehört in onPostExecute()
    - aus dem "response" solltest du die Ergebnisseite (als String) extrahieren können; diesen String gibst du (statt der null) zurück, so das er im postExec als Parameter zur Verfügung steht, und dort übergibst du ihn an deinen WebView

  • Hey... erstmal danke für deine Antwort ^^

    also ich habe hoffentlich jetzt deinen Rat befolgt, wenn ich das so richtig verstanden habe :).

    Java-Quellcode

    1. public class MainActivity extends Activity {
    2. final Context context = this;
    3. @Override
    4. public void onCreate(Bundle savedInstanceState) {
    5. super.onCreate(savedInstanceState);
    6. setContentView(R.layout.activity_main);
    7. }
    8. private class LoadWebPageASYNC extends AsyncTask<String, Void, String> {
    9. @Override
    10. protected String doInBackground(String... urls) {
    11. String result = "";
    12. // Create a new HttpClient and Post Header
    13. HttpClient httpclient = new DefaultHttpClient();
    14. HttpPost httppost = new HttpPost("http://example.org");
    15. try {
    16. List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    17. nameValuePairs.add(new BasicNameValuePair("userid", "test"));
    18. nameValuePairs.add(new BasicNameValuePair("userpass", "test"));
    19. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    20. // Execute HTTP Post Request
    21. HttpResponse response = httpclient.execute(httppost);
    22. HttpEntity entity = response.getEntity();
    23. result = EntityUtils.toString(entity, "UTF-8");
    24. } catch (ClientProtocolException e) {
    25. // TODO Auto-generated catch block
    26. } catch (IOException e) {
    27. // TODO Auto-generated catch block
    28. }
    29. return result;
    30. }
    31. @Override
    32. protected void onPostExecute(String result) {
    33. WebView webView = (WebView) findViewById(R.id.webView);
    34. webView.getSettings().setJavaScriptEnabled(true);
    35. webView.loadUrl("http://example.org");
    36. }
    37. }
    38. public void dummyFunc(View view){
    39. Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
    40. }
    41. public void readWebpage(View view) {
    42. LoadWebPageASYNC task = new LoadWebPageASYNC();
    43. task.execute(new String[] {"http://example.org" });
    44. }
    45. }
    Alles anzeigen

    Wie meinst du das mit dort übergibst du ihn an den Webview? :-X
  • Sieht doch schon viel besser aus :)

    Ich meinte das so, wie ich es geschrieben habe :P
    In deiner Zeile 42 sollte die Antwort des Servers auf deinen Request abgeliefert werden, wenn du alles richtig gemacht hast;
    im deiner Zeile 46 bekommst du eben diesen String wieder geliefert (in den UI Thread), und das willst du doch vermutlich anzeigen, statt"http://example.org"?
    Da der String kein URL ist, schau mal nach loadData() oder loadDataWithBaseURL() (beide aus dem Gedächtnis, kann also sein das die nur so ähnlich heißen), damit solltest du das gewünschte Ergebnis erhalten.
  • Meinst du ich soll die onPostExecute so anpassen?

    Java-Quellcode

    1. @Override
    2. protected void onPostExecute(String result) {
    3. WebView webView = (WebView) findViewById(R.id.webView);
    4. webView.getSettings().setJavaScriptEnabled(true);
    5. webView.loadData(result, "text/html", "utf-8");


    Wenn ja dann erscheint die Seite jetzt auch nur ohne Grafiken und die Felder sind auch leider nicht ausgefüllt.
    Wie mach ich das jetzt?

    Danke nochmal das du mir hilfst :)
  • Dachte ich mir schon, das es mit loadData() nur halb funktionieren würde (kommt halt auf die Seite an).

    Darum hatte ich dir ja auch gleich noch eine Alternative genannt:
    developer.android.com/referenc…String, java.lang.String)
    (Offenbar darf ich hier keine anklickbaren Links einfügen, das Symbol in der Leiste ist disabled)
    Edit: oder doch? Nach dem ersten Speichern war der Link nicht klickbar, nach dem 2. dann doch...
  • Wären die Daten nicht gesendet worden, dann würdest du die Seite gar nicht angezeigt bekommen, oder?

    Daher wäre meine erste Vermutung, das du nicht alle Daten übermittelt hast, die von der Originalseite übertragen werden.

    Das scheint mir auffällig:
    html: input type="text" name="id"
    aber:
    java: BasicNameValuePair("userid", "idexample")
  • Stimmt eigentlich würde ich dann ja kein response bekommen.

    Ups...hab den Falschen HTML-Code gepostet. Hier ist es Userid und userpass... also dadran kann es nicht liegen

    HTML-Quellcode

    1. <table>
    2. <tr>
    3. <th class="topLine">Benutzername:</th>
    4. <td class="tdunkel"><input type="text" name="userid" maxlength="16" size="20"/></td>
    5. </tr>
    6. <tr>
    7. <th class="topLine">Passwort:</th>
    8. <td class="thell"><input type="password" name="userpass" maxlength="16" size="20"/></td>
    9. </tr>
    10. <tr>
    11. <td class="topLine" style="text-align:center;" colspan="2"><input type="submit" name="submit" value="login"/></td>
    12. </tr>
    13. </table>
    Alles anzeigen
  • Einen response würdest du in jedem Fall bekommen, bei falschen/leeren Daten dann halt sowas wie "Passwort falsch" o.ä.

    In deinem HTML Code steht noch ein 3. Wertepaar (submit=login), das würde bei manuellem Ausfüllen der form mit übertragen werden, von deinem Java Code aber nicht.
    Wäre einen Versuch wert, oder?

    Ansonsten könnte ich mir vorstellen, das der Betreiber der Webseite solche Auto-Logins nicht möchte und darum gewisse Hürden etabliert hat, um sowas zu erschweren/verhindern.
    Mit PHP kenne ich mich nicht aus, aber wenn der Login mein Auftrag gewesen wäre, dann wäre meine erste Recherche, ob man nicht herausfinden kann, ob der Request vom eigenen Server kam ;)
  • Java-Quellcode

    1. try {
    2. List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
    3. nameValuePairs.add(new BasicNameValuePair("userid", "test"));
    4. nameValuePairs.add(new BasicNameValuePair("userpass", "test"));
    5. nameValuePairs.add(new BasicNameValuePair("submit", "submit")); // was muss hier ins 2. Feld?
    6. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));


    Hey...also so wie es jetzt ist funktioniert es auch nicht. Bei dem 3. Wertepaar handelt es sich um einen Button, der normalerweise gedrückt wird. Muss ich da irgendwas besonderes beachten?

    Eigentlich sollte es möglich sein sich dort auf diese Art einzuloggen. ?(
  • Nochmal hinschauen:
    <input type="submit" name="submit" value="login"/>


    vs.


    BasicNameValuePair("submit", "submit")

    Eigentlich sollte es möglich sein sich dort auf diese Art einzuloggen.
    Das leitest du aus welchen Fakten her?
    "Weil ich das gerne möchte" gilt nicht als Antwort ;)
  • Okay :D

    ich hatte es zuerst mit Login, mein Fehler war, dass ich es nicht so wie in HTML klein geschrieben habe.

    Woher ich weiß das es gehen muss?
    Weil es jetzt dank deiner Hilfe geht :P
    Danke nochmal :love:

    wenn ich jetzt nach dem Login auf der Seite etwas machen will muss ich Cookies verwenden oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von evoh ()

  • Woher ich weiß das es gehen muss?
    Weil es jetzt dank deiner Hilfe geht :P
    Das gilt nicht als Herleitung, aber schön das du es nun hinbekommen hast :)

    Danke nochmal :love:
    Gerne :)
    Ich bin ja noch neu hier, aber ist es in diesem Forum nicht vorgesehen, das man zum Bedanken den entsprechenden Button verwendet?
    Oder für was wird der verwendet?

    Ich helfe immer gerne, solange ich nicht den Eindruck gewinne, das mein Gegenüber sich mit der Materie gar nicht selber beschäftigen möchte, sondern einen fertigen Codeschnipsel von mir erwartet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von and.dev ()

  • Ich würde ja gerne den Button benutzen nur hast du ihn glaube ich nicht aktiviert. Den musst du bei jeder antwort aktivieren glaube ich.(Bedankomat aktivieren.)
    Danke für den Tipp, wäre ich im Leben nicht drauf gekommen, das ich das selber machen muss... was könnte wohl der Sinn dieser Vorgehensweise sein?
    Ich habs jedenfalls beim letzten Beitrag (und sicherheitshalber bei diesem) mal gemacht, ist da jetzt jeweils ein Button zu sehen?

    wenn ich jetzt nach dem Login auf der Seite etwas machen will muss ich Cookies verwenden oder?
    Du meinst, damit bei weiteren Seitenwechseln die Login-Info erhalten bleibt bzw. zur nächsten Seite transportiert wird?
    Das wird vom Design der Seite abhängen.
  • Ja genau also immoment bin ich danach dann wieder ausgeloggt.
    Hm, das bedeutet dann wohl, das die Login-Seite bereits irgendwas speichert, wenn es die Startseite nicht tut?
    Mit dieser Thematik kenne ich mich zu wenig aus, da werde ich dir nicht wirklich helfen können, sorry.
    Ja die Buttons sind jetzt da.
    Ich verstehe zwar noch nicht, wozu das gut sein soll, aber schön das es soweit schon mal funktioniert hat :)