WebView Login

  • 28 Antworten
  • Letztes Antwortdatum
Hallo zusammen. Ich muss leider nochmal das Thema ansprechen. Ich bekomme es einfach nicht hin. Problem liegt auch daran das ich es immer erst am nächsten Tag auf der Arbeit testen kann.
Mit folgenden App-Code habe ich es heute probiert. Nachdem ich auf Save drücke (XML wird erstellt mit User und pass, habe ich nachgeschaut)
Sobald ich dann zurück zur Main Activity gebracht werde bleibt die Seite weiss. Klicke ich in meinem Menu auf einen Button (Soll eine andere seite auf dem Server öffnen) steht dort ich bin nicht angemeldet (Login Rot)

Was mache ich falsch? Wie genau achtet der Server auf Gross/klein schreibung (zb das LoginUsername. Hatte es bis vorhin noch auf Loginusername).

Hier mal die MainAcitivity.java und die Password.java

HTML:
    private WebView webView;
    private WifiManager wifi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        webView = (WebView) findViewById(R.id.webView1);
        webView.getSettings().setLoadsImagesAutomatically(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.setWebViewClient(new WebViewClient());
        String url = "http://ibsserver/index.php?form=UserLogin";
//        String url = "http://www.google.de";
        SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
        String LoginUsername = prefs.getString("LoginUsername", null);
        String password = prefs.getString("password", "");
        if (LoginUsername != null) {
            Toast.makeText(getBaseContext(),
                    "LoginUsername=" + LoginUsername + "&password=" + password,
                    Toast.LENGTH_LONG).show();
            String data = "LoginUsername=" + LoginUsername + "&password="
                    + password;
            webView.postUrl(url, EncodingUtils.getBytes(data, "base64"));



HTML:
    Button Save;
    EditText txtUserName;
    EditText txtPassword;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.password);

        txtUserName = (EditText) this.findViewById(R.id.txtUname);
        txtPassword = (EditText) this.findViewById(R.id.txtPwd);
        Save = (Button) findViewById(R.id.button1);

        Save.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
                Editor meinEditor = prefs.edit();
                meinEditor.putString("LoginUsername", txtUserName.getText().toString());
                meinEditor.putString("password", txtPassword.getText().toString());
                meinEditor.commit();
                // TODO Auto-generated method stub
                Toast.makeText(getBaseContext(), "Login gespeichert",
                        Toast.LENGTH_LONG).show();

                Intent intent = new Intent(Password.this, MainActivity.class);
                Password.this.startActivity(intent);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        });
    }
}


Sehe nicht was ich falsch mache.

Ps. Kann man so etwas auch anders testen?

Danke nochmals für Eure Hilfe!!
 
Das hängt vom Programmiere der das Webinterface geschrieben hat. Wenn Du die Möglichkeit hast, sprich mal den Programmierer.

In den meisten Programmiersprachen sind Groß und Kleinschreibung geregelt. https://source.android.com/source/code-style.html


PS: Du überträgst das Passwort immer noch in Klartext. Wenn die App mal außerhalb des internen Netz gestartet wird, freut sich jeder Hacker über diese Geschenk. Der Hack ist wirklich sehr einfach, lässt sich sehr leicht automatisieren.
 
Hi Markus. Danke für deine Antwort.

Versteh das nicht falsch. Sicherheit ist auch mir wichtig. Im moment ist es mir aber auch wichtig das ganze erst einmal funktionierent zu haben. Zum anderen, wie ich schon schrieb ist es ein Heimnetzwerk. Es ist nur ein kleines Forum. Wlan hat kaum reichweite.
Trotzdem danke für deine Sorge.

Nun aber zurück zum App. Wäre die Programmierung denn so richtig?
Mit dem autlogin hatte ich es ja vorher getestet, und das funktionierte. Nun habe ich eine zweite Activity (password) erstellt wo nun der User seinen namen und password eintragen kann. Danach wird die mainactivity wieder gestartet. Es passiert bisher aber nichts. Webview bleibt weiss. Entweder lädt die Seite nicht oder es passiert garnichts.

Kann ich das ganze andersweitig testen?

Ist mein Code falsch?
 
Dein Problem liegt am am Ort, wo du dein Webaufruf machst. OnCreate wird nur beim Erstellen der Activity aufgerufen. Du müsstest den Webaufruf und den Zugriff auf die SharedPreference in die Methode onResume() Activity | Android Developers verschieben.

onResume() wird immer aufgerufen, wenn deine Activity aus dem Background geholt wird. http://developer.android.com/reference/android/app/Activity.html

Sonst sieht der Code gut aus.
http://developer.android.com/reference/android/app/Activity.html#onResume()
 
Puh. Als Anfänger verstehe ich zwar was du sagst, mir fällt aber die umsetzung nicht gerade leicht.

Meinst du das so?

HTML:
    private WebView webView;
    private WifiManager wifi;
    private SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    protected void onResume(Bundle savedInstanceState) {

        setContentView(R.layout.activity_main);
        wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        webView = (WebView) findViewById(R.id.webView1);
        webView.getSettings().setLoadsImagesAutomatically(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.setWebViewClient(new WebViewClient());
        String url = "http://ibsserver/index.php?form=UserLogin";
        SharedPreferences prefs = getPreferences(MODE_PRIVATE);
        String LoginUsername = prefs.getString("LoginUsername", null);
        String password = prefs.getString("password", "");
        if (LoginUsername != null) {
            // Toast.makeText(getBaseContext(),
            // "LoginUsername=" + LoginUsername + "&password=" + password,
            // Toast.LENGTH_LONG).show();
            String data = "LoginUsername=" + LoginUsername + "&password="
                    + password;

            webView.postUrl(url, EncodingUtils.getBytes(data, "base64"));


?? Aber was passiert beim ersten start? Dann startet der Webview ja nicht mehr direkt. Sobald der User name und pass eingegeben hat, muss er ja beim nächsten start der app nicht nochmal alles eingeben, sondern soll ja direkt auf die Seite.
Oder muss das ganze unter Create, und unter Resume eingetragen werden?
Also doppelt?

Sry. Geht mir noch nicht so leicht von der hand das ganze
 
Nee, nicht so kompliziert. ;) Hier ein Beispiel:

Code:
@Override 
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
     webView = (WebView) findViewById(R.id.webView1);
     webView.getSettings().setLoadsImagesAutomatically(true);
     webView.getSettings().setJavaScriptEnabled(true);
     webView.getSettings().setBuiltInZoomControls(true);
     webView.setWebViewClient(new WebViewClient());



 }

@Override
protected void onResume() {
     String url = "http://ibsserver/index.php?form=UserLogin";
     SharedPreferences prefs = getPreferences(MODE_PRIVATE);
     String LoginUsername = prefs.getString("LoginUsername", null);
     String password = prefs.getString("password", "");
     if (LoginUsername != null) {
        // Toast.makeText(getBaseContext(),
        // "LoginUsername=" + LoginUsername + "&password=" + password,
        // Toast.LENGTH_LONG).show();
        String data = "LoginUsername=" + LoginUsername + "&password="            + password;
         webView.postUrl(url, EncodingUtils.getBytes(data, "base64"));
       } 
}
 
  • Danke
Reaktionen: N3cron
Oh man denk ich umständlich. Das leuchtet ein.
Aber um beim ersten start (wenn der user name und pass gespeichert hat, das app schliesst und wieder startet) muss dann nicht noch bei oncreate die url rein?

Vielen Dank!!
 
Nein. Den beim ersten Start wird erst onCreate und dann onResume aufgerufen. Activity | Android Developers

Der Vorteil von onCreate ist, dass die Methode ausgeführt wird, bevor überhaupt ein View gezeichnet wird. Dort landen am besten alle Anweisungen, die nur einmal ausgeführt werden müssen.
 
Hallo zusammen. Mein App ist fertig. Allerdings habe ich noch ein Problem.
Möchte gern das der User sobald er im "MenuItem" den button logout drückt zeitgleich abgemeldet wird.

Ansich kein Problem, und doch ist da eins ;)

Und zwar bekommt man hinter der logout url immer eine art id, die sich jedesmal ändert. Wie bekomme ich diese zu beginn gespeichert und beim Logout eingesetzt.

Was kann ich dafür benutzen?

Danke
 
Zurück
Oben Unten