# Session bzw. Cookie per Volley übergeben



## wer112 (26. Apr 2022)

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!


----------



## Jw456 (26. Apr 2022)

Das könnte helfen.








						volley - persistent cookie android
					





					code-examples.net
				









						localcoder.org - Diese Website steht zum Verkauf! - Informationen zum Thema localcoder.
					

Diese Website steht zum Verkauf! localcoder.org ist die beste Quelle für alle Informationen die Sie suchen. Von allgemeinen Themen bis hin zu speziellen Sachverhalten, finden Sie auf localcoder.org alles. Wir hoffen, dass Sie hier das Gesuchte finden!




					localcoder.org


----------



## Jw456 (27. Apr 2022)

Hallo Vileicht ist es auch besser einfacher OkHttp zubenutzen.


----------



## wer112 (27. Apr 2022)

Jw456 hat gesagt.:


> 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 (27. Apr 2022)

Volley kann nicht mit Cookies umgehen.  

Deshalb seber machen mit HttpUrlConnection.  

oder andere Lib  org.apache.httpcomponents


			Apache HttpComponents – Apache HttpComponents
		


oder OKHttp


----------



## Jw456 (27. Apr 2022)

Hier noch etwas zu Volley






						Using session cookies with android volley library by JsonObjectRequest	 - TouSu Developer Zone-Ask and Answer for Developer
					

How can I use session cookies using the volley library with a request like this?   ... jsObjRequest);  thanks See Question&Answers more detail:os



					tousu.in


----------



## Jw456 (27. Apr 2022)

wer112 hat gesagt.:


> 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 (27. Apr 2022)

Jw456 hat gesagt.:


> 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
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...):


```
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 (27. Apr 2022)

Wo ist dein Header vom Post Request?

```
@Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           ....
```
sowas sehe ich nicht










						How to set custom header in Volley Request
					

How can custom headers be set for a Volley request? At the moment, there is way to set body content for a POST request. I've a simple GET request, but I need to pass the custom headers alongwith. I...




					stackoverflow.com


----------



## wer112 (27. Apr 2022)

Jw456 hat gesagt.:


> Wo ist dein Header vom Post Request?
> 
> ```
> @Override
> ...


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:


```
}
        }){
            @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 (27. Apr 2022)

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 (27. Apr 2022)

Jw456 hat gesagt.:


> 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.


Jw456 hat gesagt.:


> 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 (27. Apr 2022)

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

auch wenn du eingeloggt  bist wird ja die Kundennummer geprüft

```
if(empty($kundennummer) or empty($email) or empty($eingeloggt_bleiben)){
```
die du aber nicht  in den Parms hast.


----------



## wer112 (27. Apr 2022)

Jw456 hat gesagt.:


> 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:


```
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();

                                   }
```



Jw456 hat gesagt.:


> auch wenn du eingeloggt  bist wird ja die Kundennummer geprüft
> 
> ```
> if(empty($kundennummer) or empty($email) or empty($eingeloggt_bleiben)){
> ...



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 (27. Apr 2022)

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 (28. Apr 2022)

Jw456 hat gesagt.:


> Volley kann nicht mit Cookies umgehen.
> 
> Deshalb seber machen mit HttpUrlConnection.
> 
> ...


Leider kann ich das nicht verwenden, sobald ich es importiere, Bekomme ich ein error. Deswegen, habe ich es ausgekomment.


Jw456 hat gesagt.:


> oder OKHttp


Habe es importiert, versuche das zu verstehen, da es komplizierter ist als Volley.


----------



## wer112 (28. Apr 2022)

Jw456 hat gesagt.:


> Wo ist dein Header vom Post Request?
> 
> ```
> @Override
> ...


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:


```
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:


```
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!*


----------

