Spring session

1

Witam, chciałem skonfigurować spring session u siebie w aplikacji.

Config mam na wzór tego https://docs.spring.io/spring-session/docs/current/reference/html5/guides/java-rest.html

Na froncie mam angulara i próbowałem to jakoś zrobić na bazie x-auth-token i localStorage, ale mimo wszystko wchodzac pod inny endpoint za kazdym razem dostaje inny sessionId.

Ktos moglby mi powiedziec jak najprosciej to skonfigurowac, tak zeby caly czas byla ta sama sesja?

0

help someone plz

0

Pokaż jak to zrobiłeś po stronie backendu.

0

tak to wyglada:

@Configuration
@EnableRedisHttpSession
class SessionConfig {

    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory();
    }
    @Bean
    public HttpSessionIdResolver httpSessionIdResolver() {
        return HeaderHttpSessionIdResolver.xAuthToken();
    }

    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }
}

W configu security mam coś takiego:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.ALWAYS)

...cd

i generalnie w kontrolerze mam coś takiego

    @GetMapping("/products/session")
    public Map<String, String> session(HttpServletRequest httpServletRequest){
        System.out.println(httpServletRequest.getSession().getId());
        return Collections.singletonMap("token",httpServletRequest.getSession().getId());
    }

gdzie potem w angularze obsługuje to że

this.sessionService.getSessionId().subscribe(
response=>{
localStorage.setItem(response.json().token);
});

i w sumie tyle, problem w tym że z kazdym odświeżeniem strony itd łapany jest inny sessionId.

0

A w oknie prywatnym (prywatny tryb w przeglądarce) też źle działa? Warto sprawdzać, bo czasem przeglądarka śmieci ciastkami.

0

incognito też nie pomaga, ten sam efekt :/

0
00beba30-9d9b-418c-91ef-183eb60e876f
Hibernate: select product0_.id as id1_0_, product0_.active as active2_0_, product0_.creation_date as creation3_0_, product0_.description as descript4_0_, product0_.in_stock_number as in_stock5_0_, product0_.name as name6_0_, product0_.price as price7_0_, product0_.type as type8_0_ from product product0_ where product0_.type=?
820e4ada-5e52-41a7-a00a-59cafbc16a2f
4e0654e9-fa70-437f-9846-7e4671c38826
Hibernate: select product0_.id as id1_0_, product0_.active as active2_0_, product0_.creation_date as creation3_0_, product0_.description as descript4_0_, product0_.in_stock_number as in_stock5_0_, product0_.name as name6_0_, product0_.price as price7_0_, product0_.type as type8_0_ from product product0_ where product0_.type=?
63e06f90-f20a-4c2a-bdfc-c3fd55b9ce2e
09d0e144-26a6-4af1-ab3d-9f1378950383
Hibernate: select product0_.id as id1_0_, product0_.active as active2_0_, product0_.creation_date as creation3_0_, product0_.description as descript4_0_, product0_.in_stock_number as in_stock5_0_, product0_.name as name6_0_, product0_.price as price7_0_, product0_.type as type8_0_ from product product0_ where product0_.type=?
7482bc7b-7359-4870-834e-174bee2ca05b
0eeaa1bf-6a77-4d31-a295-1c95ccb9d896
Hibernate: select product0_.id as id1_0_, product0_.active as active2_0_, product0_.creation_date as creation3_0_, product0_.description as descript4_0_, product0_.in_stock_number as in_stock5_0_, product0_.name as name6_0_, product0_.price as price7_0_, product0_.type as type8_0_ from product product0_ where product0_.type=?

tak wlasnie to wyglada po wybraniu produktu na froncie, za kazdym innym razem inne sessionId

0

Pobaw się wgetem, curlem czy czymś takim i zobacz jak to funkcjonuje. Wywołaj 1 raz, zapamiętaj cookie, wywołaj drugi raz. Najpierw poćwicz na prawidłowej stronie. Może wtedy coś się rozjaśni.

0

to jest dziwne, bo jak łącze do tego spring security to wtedy po zalogowaniu na froncie, wyslaniu credentials przez base64 sesja sie utrzymuje caly czas... mimo ze caly czas ten sam config.

0

Może być taki konflikt między ciasteczkami http i https. Jeżeli przelaczasz sie między protokolami. Jest jakaś flaga na serwerze, która to kontroluje. Musisz to dokładnie prześledzić. W razie konieczności poczytaj o cookie flag.

0

Spróbuj zmienić

.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)

na

.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
0
NoZi napisał(a):

Spróbuj zmienić

.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)

na

.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)

Próbowałem też w ten sposób ale niestety brak efektów :/

0

Jak juz zczytasz w angularze to session id to przy kolejnych żądaniach powinnieneś przesylać to session id jako nagłówek X-Auth-Token. Robisz tak?

0
PiotrekK napisał(a):

Jak juz zczytasz w angularze to session id to przy kolejnych żądaniach powinnieneś przesylać to session id jako nagłówek X-Auth-Token. Robisz tak?

Nie jestem pewien, robie to w ten sposób:

    if (this.sessionOn === false){
      this.productService.getSession().subscribe(
        res=>{
          localStorage.setItem("xAuthToken", res.json().session);
        console.log(res);
        }
      );
      this.sessionOn = true;
    } else {
      console.log("active");
    }
  getSession(){
    let url = "http://localhost:8080/products/kurla"
    let headers = new Headers ({
      'Content-Type' : 'application/json',
    });
    return this.http.get(url, {headers: headers});
  }

następnie przy weryfikacji w ten sposob:

  verifySession(){
    let url = "http://localhost:8080/verifySession";
    let headers = new Headers({
      'x-auth-token' : localStorage.getItem('xAuthToken')
    });
    return this.http.get(url, {headers:headers});
  }

czy o to mniej wiecej chodzilo czy nie?

0

Hmm, wygląda ok. Zobacz jeszcze w narzedziach developerskich przegladarki czy faktycznie jest ten naglowek ustawiany przy wysylaniu zadania na /verifySession.

0
PiotrekK napisał(a):

Hmm, wygląda ok. Zobacz jeszcze w narzedziach developerskich przegladarki czy faktycznie jest ten naglowek ustawiany przy wysylaniu zadania na /verifySession.

Wszystko wskazuje na to że jest:

title

title

Ale chyba już doszedłem co jest powodem, z każdym refreshem strony glownej /home, przyznawany mi jest nowy sessionId ponieważ:

if (this.sessionOn === false){
      this.productService.getSession().subscribe(
        res=>{
          localStorage.setItem("xAuthToken", res.json().session);
        console.log(res);
        }
      );
      this.sessionOn = true;
    } else {
      console.log("active");
    }

zmieniłem to na

if (localStorage.getItem("xAuthToken") == null)

i wszystko jest okej.
Dzięki wszystkim za pomoc;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1