Spring Sessions sind null

Diskutiere Sessions sind null im Web Tier Forum; Hallo zusammen Ich schreibe aktuell einen Webservice welcher später für andere Applikationen eingesetzt wird. Als Framework wird Spring verwendet...

  1. danielmaann
    danielmaann Neues Mitglied
    Hallo zusammen

    Ich schreibe aktuell einen Webservice welcher später für andere Applikationen eingesetzt wird.
    Als Framework wird Spring verwendet und beim Webservice handelt es sich um eine Springboot Applikation. Nun...

    Sobald sich der Benutzer auf eine Applikation einloggt welche mit dem Webservice kommuniziert, sollte es für den Benutzer eine Session auf dem Webservice starten.

    Nun besteht folgendes Problem:
    Beim erstellen von der Session funktioniert alles und die Session ist gesetzt, jedoch wird bei einem zweiten Request von diesem Benutzer, ein NULL zurück gegeben so als ob diese Session gar nicht vorhanden wäre... Wehslab? Was habe ich nicht beachtet? PS. ich arbeite nicht mit dem Redis.

    Code (Java):
    @RequestMapping(value = "/login", method = RequestMethod.POST)
        public String login(@RequestParam("email") String email, @RequestParam("password") String password, HttpServletRequest request) {
            String resultString = "{\"error\":\"true\",\"intend\":\"login\"}";
         
            if(authValidator.checkEmail(email) && authValidator.checkPassword(password)){
                resultString = userHandler.login(email, password).toString();
                gson = new Gson();
                User user = gson.fromJson(resultString, User.class);
                if (!user.isError() && "1".equals(user.getAgb())) {
                    String token = UUID.randomUUID().toString(); // token wird benötigt für doppelte Logins
                    System.out.println(sessionHandlerImpl.existSessionWithToken(request, user.getUid(), token)); // gibt TRUE zurück
                    resultString = sessionHandlerImpl.getStoredProfile(request, user.getUid()); // gibt auch den richtigen String zurück
                }
            }
            return resultString;
        }
    Code (Java):
    @RequestMapping(value = "/user", method = RequestMethod.GET)
        public String getUserPage(ModelMap model, HttpServletRequest request, HttpServletResponse response) {
            String myUid = request.getParameter("userId");
            String suid = isNotEmpty(request.getParameter("sUid")) ? request.getParameter("sUid") : myUid;
            String token = request.getParameter("token");
         
            String resultProfile = "{\"error\":true,\"username\":\"\",\"name\":\"\",\"description\":\"\",\"profilepicture\":\"\",\"following\":\"\",\"intend\":\"get user page\"}";
            sessionHandlerImpl.existSessionWithToken(request, myUid, token); // gibt FALSE zurück
            if (sessionHandlerImpl.existSessionWithToken(request, myUid, token)) {
                if (isNotEmpty(myUid)){
                    if (authValidator.checkUserId(myUid)) {
                        if (sessionHandlerImpl.existSession(request, suid)) {
                            resultProfile = sessionHandlerImpl.getStoredProfile(request, suid);
                        } else if (myUid.equals(suid)) {
                            resultProfile = userHandler.getMyUserPage(myUid);
                        } else if (authValidator.checkUserId(suid)) {
                            resultProfile = userHandler.getUserPage(myUid, suid);
                        }
                    }
                }
            } else {
                response.setStatus(403);
            }
            return resultProfile;
        }
    der zweite block wird nach dem login ausgeführt...


    Code (Java):
        public void createSession(HttpServletRequest request, String token, String jsonUserObj) {
            gson = new Gson();
            User user = gson.fromJson(jsonUserObj, User.class);
            user.setToken(token);
            request.getSession().setAttribute(user.getUid(), user);
        }


        public boolean existSessionWithToken(HttpServletRequest request, String userId, String token) {
            try {
                User user = (User) request.getSession(false).getAttribute(userId);
                return user.getToken().equals(token);
            } catch(NullPointerException e) {
                return false;
            }
         
        }
    Danke schon mal für die hilfe
     
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. sascha-sphw
    sascha-sphw Mitglied
    Ich habe mir jetzt den Code noch nicht im Detail angesehen, aber es hört sich für mich so an, als ob beim 2. Request die SessionID vom Benutzer nicht mitgeschickt wird.

    Zudem würde ich noch gerne anmerken, dass es sich bewährt hat, dass man einen Service Stateless aufbaut.
     
  4. danielmaann
    danielmaann Neues Mitglied
    @sascha-sphw
    wie kann ich die sessionId midt schicken, wird die nicht selbst einfach mitgeschickt im RequestHeader? also ich meine die SessionId? Dachte die ist ein automatischer bestandteil eines requests?

    Zu deiner anmerkung, was bedeuted jetzt da stateless? also welcher teil ist stateless? kenne diesen begriff in der SW gar nicht
     
  5. sascha-sphw
    sascha-sphw Mitglied
    Die Session ID wird vom Server im Header an den Client geliefert (Set-Cookie: JSESSIONID=405E20BF2689B7CA0790F2DB27F5AA2F). Der Browser würde die ID somit als Cookies speichern und schickt sie automatisch bei jedem weiteren Request wieder mit zum Server. Und meine Vermutung ist jetzt, dass das bei Deinem Client nicht der Fall ist. Ich würde hier einfach mal den Request sniffen und schauen ob das der Fall ist.

    Wiki (https://de.wikipedia.org/wiki/Zustandslosigkeit) sagt. Und damit meinte ich den kompletten Service.
     
  6. danielmaann
    danielmaann Neues Mitglied
    @sascha-sphw
    also werde ihn mal sniffen... kenne die sessions eigendlich nur von PHP aus, habe mit Java nie mit Sessions gearbeitet. Dies ist zum erstenmal der Fall.

    Der Web-Service ist halt eine Java-Applikation aber zum Testen benutze ich als ClientApplikation eine PHP-Page welche die Requests absendet und kontrolliert ob die erwarteten daten zurück kommen.


    Bezüglich der Zustandaslosigkeit, dies möchte ich ja nun mit den Sessions ablösen damit ich durch jeden Request den Zustand überprüfen kann (ob der Benutzer eingeloggt ist oder nicht)

    wieso sollte es aber stateless sein? Man sollte ja übrprüfen ob ein benutzer eigeloggt ist oder nicht? sonst können request abgesetzt werden von bestimmten benutzen die nicht eingeloggt sind.
     
  7. sascha-sphw
    sascha-sphw Mitglied
    Das wird in der Regel mit Access Token gemacht. Du kannst Dir das in in etwa wie einen Funktionsaufruf vorstellen, alle Parameter die zum Bearbeiten benötigt werden, werden immer mitgeschickt.

    Du kannst Dir dazu mal OAuth2 anschauen, wie sowas umgesetzt wird.
     
  8. danielmaann
    danielmaann Neues Mitglied
    @sascha-sphw

    habe mich zu dem OAuth2 eingelesen und finde diesen ansatz ziemlich bescheuert... sehe ich das richtig, dass folgendes passiert:
    1. Daten werden einer URL mitgegeben (consumer-key, timestamp, callbackurl,...) z.B. bei login
    2. da wird etwas gemacht und dann redirected zu der callback url
    3. User möchte profil beabbeiten nun passiert das selbe nur via andere callback URL somit wird wieder der benutzer "eingeloggt" oder ja überprüft ob die login daten korrekt sind bevor die 2. methode ausgeführt wird.

    Dies löst ja aus das es pro einfachen Use-Case mehrere Abfragen gibt (jedesmal wird überprüft ob die credentials richtig sind) statt dies in eine session zu packen. dieser ansatz kostte ja deutlich mehr ressourcen oder nicht?
     
  9. sascha-sphw
    sascha-sphw Mitglied
    Wenn Du das so interpretierst, solltest Du es evtl. noch einmal lesen. Dieser Login Prozess muss nur einmal gemacht werden, danach hast Du den Access Token und alles geht weiterhin mit nur einem Request.
    Aber ich will Dir hier nichts aufschwatzen OAuth2 war nur ein Beispiel wie man das mit Token machen kann. Wegen mir musst Du es auch nicht Stateless machen, hab nur erwähnen wollen das RESTful Services normalerweise Stateless sind.

    Aber mal zurück zu Deinem eigentlichen Problem, hast Du den Request bereits angesehen? Ist Die Session ID enthalten?
     
  10. danielmaann
    danielmaann Neues Mitglied
    @sascha-sphw
    ja habe es nun auch begriffen aber dieser vorgang ist ziemlich kompliziert und dafür wird angeblich extra ein server gebraucht nur für die tokens sache .. gibt ja den owner den server und noch eine dritte instanz wo für das OAuth2 benötigt wird... habe mich gestern den ganzen Tag damit beschäftigt aber kann mir kein Bild machen wie das funktionieren soll bzw. wie ich das einsetzten soll da ich nichtmals anständige Examples gefunden habe und die Examples für Spring boot funktionieren nicht einmal.. die werfen schnell mal exceptions... naja .. ich möchte eben die beste und performanteste lösung da der Webservice dann auch kommerziel verwendet werden soll und nicht nur als übung dient.

    Nein konnte da nichts herausfinden da meine Clientseitige Applikation eine PHP applikation ist (benutze PHP um dern Webservice zu testen und wenn alles rund läuft wird dann eine Android App entwicklet welche auf diesen Webservice kommuniziert) kann ich ja it den vorhandenen session methoden nur eigene Sessions von php neu generieren und nicht die gekriegte Session id heraus finden? ich habe gestern auch nach der lösung gesucht aber war nicht fündig.
     
  11. danielmaann
    danielmaann Neues Mitglied
    @sascha-sphw

    beim überprüfen vom request header sind die beiden JSESSIONID Werte gleich von beiden requests und die XSRF-Tokens ebenfalls aber die Session wird nicht gefunden... weshalb nicht?

    PS mir ist aufgefallen das der aufruf dieser methode nach dem erzeugen der session session.getId() nicht den selben wert hat wie wenn ich auf der clientseite den header auslese und die JSessionId anzeige ... da sind unterschiedliche werte, weshalb?
     
    Zuletzt bearbeitet: 16. Nov. 2016
Die Seite wird geladen...

Sessions sind null - Ähnliche Themen

Entitybean direkt in Sessionscoped Bean referenzieren
Entitybean direkt in Sessionscoped Bean referenzieren im Forum Allgemeines EE
SSH sessions
SSH sessions im Forum Allgemeine Java-Themen
Authentifizierung und Sessions in Java EE7
Authentifizierung und Sessions in Java EE7 im Forum Allgemeines EE
Sessions invalidieren
Sessions invalidieren im Forum Web Tier
SessionScoped und Stateful EJB: Werte werden nicht behalten
SessionScoped und Stateful EJB: Werte werden nicht behalten im Forum Allgemeines EE
Thema: Sessions sind null