Session bzw. Cookie per Volley übergeben

wer112

Top Contributor
Sehr geehrtes Forum,

ich habe ein Problem. Wenn ich mich einlogge(PHP) und alle Daten übereinstimmen, dann startet eine Session und es werde Informationen gespeichert z.B. ob ein Benutzer eingeloggt ist oder nicht. Für was alles gibt es irgendwelche PHP Scripte, die über Volley laufen. Ich möchte die Session Variablen oder andere Werte z.B. per Json übergeben. Leider sind alle Session Variablen weg. Nach Recherchen, ergab, das ich irgendwie Cookies mit Volley übergeben muss, wo da drinnen die ganzen Sessions gespeichert sind. Ich suche einen Code, der auf jede Android Version funktioniert.

Wie hole ich mir die gespeicherten Cookies?
Wie hänge ich es an Volley dran?

bzw. wie kann ich es per HTTP Header die Cookies übergeben?

Dachte eigentlich, wenn ich eine PHP Datei aufrufe und dann eine Session starte, dass es auf dem Handy gespeichert wird und wenn ich eine andere Seite aufrufe, dass genau die Session automatisch geholt wird, sowie im normalem Internet. Leider muss ich jedes Mal die Session Cookies mit übergeben.
Da ich sowas noch nie gemacht habe, wäre ich froh, wenn ihr mir ein Code/Seite geben könnt, wie ich die Login Session mit übergeben kann bzw. der Cookie mit die Sessions...



Ich danke euch schon mal im Vorraus!
 

wer112

Top Contributor
Hallo Vileicht ist es auch besser einfacher OkHttp zubenutzen.
ICh verwende aktuell überall Volley. Ich würde es einheitlich machen wollen. Bei Volley, kann ich langsam damit grob umgehen. Bei OKhttp muss ich mich reinarbeiten. Für mich sieht Okhttp komplizierter aus.

Welche Vorteile hat OKHttp?
Evtl. werde ich es mal in der Beta Version es testen, wenns besser ist.
 

Jw456

Top Contributor
Dachte eigentlich, wenn ich eine PHP Datei aufrufe und dann eine Session starte, dass es auf dem Handy gespeichert wird und wenn ich eine andere Seite aufrufe, dass genau die Session automatisch geholt wird, sowie im normalem Internet. Leider muss ich jedes Mal die Session Cookies mit übergeben.
Zeige mal wie du das machst. was machst du ein Get oder einen Post Request ?
wie schaut dein Header aus was gibst du mit?
 

wer112

Top Contributor
Zeige mal wie du das machst. was machst du ein Get oder einen Post Request ?
wie schaut dein Header aus was gibst du mit?
PHP Teil für die Fragment Steuerung:

PHP:
<?php
session_start();

$kundennummer = $_SESSION['kn'];
$email = trim($_SESSION['emailadresse']);
$angemeldet = trim($_SESSION['angemeldet']);
$eingeloggt_bleiben = trim($_SESSION['eingeloggtbleiben']);

   echo $kundennummer;     
      

if($angemeldet == 1){

    if(empty($kundennummer) or empty($email) or empty($eingeloggt_bleiben)){
        echo "Session Fehler.";

    }else{

        //Farben müssen geholt werden!

        $nutzerDaten = array();
        $nutzerDaten['KN'] = $kundennummer;
        $nutzerDaten['email'] = $email;
        $nutzerDaten['eingeloggtBleiben'] = $eingeloggt_bleiben;



        echo json_encode($nutzerDaten);





    }


}else{
    echo "Du bist ausgeloggt.";
    //echo "Kundennummer: " . $kundennummer . "<br>" . "Email: " . $email . "<br>" . "Eingeloggt bleiben: " . $eingeloggt_bleiben;
}

?>

Da bekomme ich immer Nixs bei dem Request. Bei Login PHP bekomme ich die Session erfolgreich. Ich möchte einfach eine Seite aufrufen und die auslesen und eigentlich nixs übergeben. Habe mehrere Verrsionen gemacht, da ich eigentlich mit Json arbeiten möchte, aber da ich ein Volley Error bekomme, bin ich kurz zum StringRequest gegangen. Ergebnis: Du bist ausgeloggt.

Mein Aktueller Import Code(Muss die Cookies dran hängen, damit PHP die Session laden kann...):

Java:
  final String url = "https://www.--------.php";

        RequestQueue queue = Volley.newRequestQueue(fragment_steuerung.this);

        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                AlertDialog.Builder builder = new AlertDialog.Builder(fragment_steuerung.this, R.style.AlertDialogTheme);
                View view = LayoutInflater.from(fragment_steuerung.this).inflate(R.layout.layout_erfolgreich_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
                builder.setView(view);
                ((TextView)view.findViewById(R.id.textTitle)).setText("Nutzer Daten");
                ((TextView)view.findViewById(R.id.textView_erfolgreich)).setText(response.toString());
                ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                ((ImageView)view.findViewById(R.id.image_erfolgreich)).setImageResource(R.drawable.ic_erfolgreich);

                final AlertDialog alertDialog = builder.create();

                view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.dismiss();

                    }
                });

                if (alertDialog.getWindow() != null){
                    alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
                }



                alertDialog.show();


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                AlertDialog.Builder builder = new AlertDialog.Builder(fragment_steuerung.this, R.style.AlertDialogTheme);
                View view = LayoutInflater.from(fragment_steuerung.this).inflate(R.layout.layout_error_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
                builder.setView(view);
                ((TextView)view.findViewById(R.id.textTitle)).setText("VolleyError");
                ((TextView)view.findViewById(R.id.textView_error)).setText("ERROR: " + error.toString());
                ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                ((ImageView)view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

                final AlertDialog alertDialog = builder.create();

                view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.dismiss();

                    }
                });

                if (alertDialog.getWindow() != null){
                    alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
                }



                alertDialog.show();




            }
        });
        queue.add(request);

Wie bereits erwähnt, es muss nixs übergeben werden, sondern die Webseite kurz aufgerufen werden und die Antwort geholt werden, sowie im normalen Browser. Leider ist eine App kein Browser und ich muss, wie ich erfahren habe, die Cookies mit an den Header hängen, wo die Session dadrinnen steht. Ich werde mal mich in den Volley Cookies Links reinarbeiten...
 

Jw456

Top Contributor
Wo ist dein Header vom Post Request?
Java:
@Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           ....
sowas sehe ich nicht


 

wer112

Top Contributor
Wo ist dein Header vom Post Request?
Java:
@Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           ....
sowas sehe ich nicht
also muss ich getHeaders() machen und dort übergebe ich den Cookie?
Dachte, das das Map nur für die Übergaben von Infos sind und man das zum Aufruf der PHP Seite das nicht braucht.

Im Login/Registrieren/Passwort zurücksetzen, da gibt es ein Map:

Java:
}
        }){
            @Nullable
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();
                param.put("email", emailadresse);
                param.put("pass", passwort);

                param.put("paname", packagename);



                return param;
            }
        };

        request.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        MySingleRegister.getmInstance(login.this).addToRequestQueue(request);
 

Jw456

Top Contributor
Du musst bei jedem Reqest die Login Daten im Header mitgeben.
Aber du hast gar keinen Header der das übergibt. Somit kann auch beim Server nichts ankommen von den Daten.

Dein Browser macht das im dich da siehst du die Intelligenz den Browser.
 

wer112

Top Contributor
Du musst bei jedem Reqest die Login Daten im Header mitgeben.
Aber du hast gar keinen Header der das übergibt. Somit kann auch beim Server nichts ankommen von den Daten.
Die Daten kommt an auf der Registrierungsseite/Login/Passwort zurücksetzen. Bisher hatte ich nie Probleme gehabt. Und im YT Video, wurde nie ein Header benutzt. Deswegen wusste ich das nicht. Also schaue ich mir das mit dem Header an und übergebe die Cookies.
Dein Browser macht das im dich da siehst du die Intelligenz den Browser
Der ist schlauer als eine App, da er die Cookies/Session automatisch lädt. So gut bin ich noch net xD
 

Jw456

Top Contributor
erstellt dein Server oder das Javascript in der Webseite überhaut Cookies

auch wenn du eingeloggt bist wird ja die Kundennummer geprüft
Java:
if(empty($kundennummer) or empty($email) or empty($eingeloggt_bleiben)){
die du aber nicht in den Parms hast.
 
Zuletzt bearbeitet:

wer112

Top Contributor
erstellt dein Server oder das Javascript in der Webseite überhaut Cookies
Wenn Email und Passwort stimmt, wird der Nutzer eingeloggt und gibt ein Echo aus, dass es erfolgreich war und dann kommt man in die Fragment Steuerung, ansonsten gibt es ein Fehlercode(Email oder Passwort sind falsch...):

Der Login Ausschnitt, nachdem die Überprüfung erfolgreich war:

PHP:
 if($user['angemeldet_bleiben'] < 1){
                                    session_start();

                                    
                                    

                                    $angemeldetInt = 1;
                                    $eingeloggtbleibenInt = 0;


                                    $_SESSION['kn'] = $KNergebniss;
                                    $_SESSION['emailadresse'] = $email;
                                    $_SESSION['angemeldet'] = $angemeldetInt;
                                    $_SESSION['eingeloggtbleiben'] = $eingeloggtbleibenInt;

                                  //  echo  $_SESSION['kn'] . "\n" . $_SESSION['angemeldet'];

                                      $echo = 10;
                                       echoSwitch();

                                   }else if($user['angemeldet_bleiben'] > 0){

                                        //Der Nutzer will angemeldet bleiben...


                                    $echo = 11;
                                    echoSwitch();

                                   }
auch wenn du eingeloggt bist wird ja die Kundennummer geprüft
Java:
if(empty($kundennummer) or empty($email) or empty($eingeloggt_bleiben)){
die du aber nicht in den Parms hast.

Die brauche ich nicht in den Parms, da die Daten(Kundennummer, Email,..) in den Sessions gespeichert werden und dann auf der anderen PHP Script wieder rausgeholt wird und in Variablen gespeichert werden und geprüft, ob der Nutzer eingeloggt ist. Die Kundennummer würd im Login Bereich aus der Datenbank geholt und in ne Session abgespeichert....
 

Jw456

Top Contributor
Http ist ein Verbindungs loses Protokoll. Wenn du einen normalen request machst ohne etwas worann der Server erkennt das du es bist der schon eingeloggt ist. Wird das nicht gehn.

Der Browser macht das für dich wenn du auf deiner Webseite einen link klickst und ein neuer request an den Server gestellt wird.
Deine app nicht das muss du selber machen.

Teste doch al was am server ankommt wenn du mit dem Browser arbeitest.
Und wie der request ausschaut von deiner App.
Sniffe es doch mit.
 

wer112

Top Contributor

wer112

Top Contributor
Wo ist dein Header vom Post Request?
Java:
@Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           ....
sowas sehe ich nicht
Ich bedanke mich, mit dem Hinweis mit dem Header. Ich brauche den Header, außer für das Login, da ich erst die Session brauche, die ich dann Abspeichere und die dann an den Header hänge.

An Alle, dass ist die Variante, die funktioniert:

Login:

Java:
        CookieManager cookieManager = new CookieManager();
        CookieHandler.setDefault(cookieManager);

        String url = "https://www.----.php";



        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                if(response.equals("Login Success")){
                   startActivity(new Intent(login.this, fragment_steuerung.class));
                   finish();


                }else if(response.equals("LS1")){

                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString(getResources().getString(R.string.prefLoginState), "loggendin");

                    editor.apply();

                    startActivity(new Intent(login.this, fragment_steuerung.class));
                    finish();


                }else if(response.equals("Dein Account ist nicht Aktiviert wurden. Bitte Bestätige deine Email Adresse.")){

                    AlertDialog.Builder builder = new AlertDialog.Builder(login.this, R.style.AlertDialogTheme);
                    View view = LayoutInflater.from(login.this).inflate(R.layout.layout_email_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
                    builder.setView(view);
                    ((TextView)view.findViewById(R.id.textTitle)).setText(getString(R.string.account_nicht_acktiviert_dialog_ueber));
                    ((TextView)view.findViewById(R.id.textView_email)).setText(getString(R.string.account_nicht_aktiviert));
                    ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                    ((ImageView)view.findViewById(R.id.image_email)).setImageResource(R.drawable.ic_email2);

                    final AlertDialog alertDialog = builder.create();

                    view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            alertDialog.dismiss();

                        }
                    });

                    if (alertDialog.getWindow() != null){
                        alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
                    }



                    alertDialog.show();


                }else{
                    AlertDialog.Builder builder = new AlertDialog.Builder(login.this, R.style.AlertDialogTheme);
                    View view = LayoutInflater.from(login.this).inflate(R.layout.layout_error_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
                    builder.setView(view);
                    ((TextView)view.findViewById(R.id.textTitle)).setText(getString(R.string.login_fehlgeschlagen_uber));
                    ((TextView)view.findViewById(R.id.textView_error)).setText(getString(R.string.login_fehlgeschlagen_grund) + " " + response);
                    ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                    ((ImageView)view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

                    final AlertDialog alertDialog = builder.create();

                    view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            alertDialog.dismiss();

                        }
                    });

                    if (alertDialog.getWindow() != null){
                        alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
                    }



                    alertDialog.show();



                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                AlertDialog.Builder builder = new AlertDialog.Builder(login.this, R.style.AlertDialogTheme);
                View view = LayoutInflater.from(login.this).inflate(R.layout.layout_error_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
                builder.setView(view);
                ((TextView)view.findViewById(R.id.textTitle)).setText("VolleyError");
                ((TextView)view.findViewById(R.id.textView_error)).setText("ERROR: " + error.toString());
                ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                ((ImageView)view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

                final AlertDialog alertDialog = builder.create();

                view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.dismiss();

                    }
                });

                if (alertDialog.getWindow() != null){
                    alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
                }



                alertDialog.show();




            }
        }){
            @Nullable
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> param = new HashMap<>();
                param.put("email", emailadresse);
                param.put("pass", passwort);

                param.put("paname", packagename);



                return param;
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> header = new HashMap<>();

                return  header;
            }

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                try {
                    String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                    String header_response = String.valueOf(response.headers.values());
                    int index1 = header_response.indexOf("PHPSESSID=");
                    int index2 = header_response.indexOf(("; path"));

                    String session_id = header_response.substring(index1, index2);

                    SharedPreferences sharedPreferences = getSharedPreferences("Session", MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString("SessionID", session_id);
                    editor.apply();

                    Log.d("Cookie", session_id);


                    return Response.success(jsonString, HttpHeaderParser.parseCacheHeaders(response));
                }catch (UnsupportedEncodingException e){
                    Log.d("Cookie Fehler", e.toString());
                    return  Response.error(new ParseError(e));
                }
            }
        };

        request.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        MySingleRegister.getmInstance(login.this).addToRequestQueue(request);

Und so hänge ich es an den Header auf ne andere Klasse:

Java:
 final String url = "https://www.----.php";

        String sessionID = "";



        SharedPreferences pref = getSharedPreferences("Session", MODE_PRIVATE);
        sessionID = pref.getString("SessionID", sessionID);





        RequestQueue queue = Volley.newRequestQueue(fragment_steuerung.this);

        String finalSessionID = sessionID;
        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                CookieManager cookieManager = new CookieManager();
                CookieHandler.setDefault(cookieManager);

                AlertDialog.Builder builder = new AlertDialog.Builder(fragment_steuerung.this, R.style.AlertDialogTheme);
                View view = LayoutInflater.from(fragment_steuerung.this).inflate(R.layout.layout_erfolgreich_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
                builder.setView(view);
                ((TextView)view.findViewById(R.id.textTitle)).setText("Nutzer Daten");
                ((TextView)view.findViewById(R.id.textView_erfolgreich)).setText(response.toString());
                ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                ((ImageView)view.findViewById(R.id.image_erfolgreich)).setImageResource(R.drawable.ic_erfolgreich);

                final AlertDialog alertDialog = builder.create();

                view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.dismiss();

                    }
                });

                if (alertDialog.getWindow() != null){
                    alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
                }



                alertDialog.show();


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                AlertDialog.Builder builder = new AlertDialog.Builder(fragment_steuerung.this, R.style.AlertDialogTheme);
                View view = LayoutInflater.from(fragment_steuerung.this).inflate(R.layout.layout_error_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
                builder.setView(view);
                ((TextView)view.findViewById(R.id.textTitle)).setText("VolleyError");
                ((TextView)view.findViewById(R.id.textView_error)).setText("ERROR: " + error.toString());
                ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                ((ImageView)view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

                final AlertDialog alertDialog = builder.create();

                view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.dismiss();

                    }
                });

                if (alertDialog.getWindow() != null){
                    alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
                }



                alertDialog.show();




            }
        }){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> header = new HashMap<>();

                header.put("Set-Cookie", finalSessionID);

                return header;
            }
        };
        queue.add(request);

Ich hoffe ich konnte euch weiterhelfen, wenn ihr das gleiche Problem habt.
Das ist ein Aktuelles, was klappt(Bei mir).
Da ich schlecht bin, kann der Code Fehler enthalten.

Ein ganz Großen Dank geht an Jw456, der Paar gute Ratschläge hatte!
 

Neue Themen


Oben