sql >> Database teknologi >  >> NoSQL >> MongoDB

Forårssession med MongoDB

1. Oversigt

I denne hurtige vejledning vil vi undersøge, hvordan du bruger Spring Session understøttet af MongoDB, både med og uden Spring Boot.

Spring Session kan også understøttes af andre butikker såsom Redis og JDBC.

2. Spring Boot Configuration

Lad os først se på afhængighederne og den nødvendige konfiguration til Spring Boot. Til at starte med, lad os tilføje de nyeste versioner af spring-session-data-mongodb og spring-boot-starter-data-mongodb til vores projekt:

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-mongodb</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

For at aktivere automatisk konfiguration af Spring Boot skal vi tilføje Spring Session-butikstypen som mongodb i application.properties :

spring.session.store-type=mongodb

3. Fjederkonfiguration uden fjederstøvle

Lad os nu tage et kig på afhængighederne og den nødvendige konfiguration for at gemme Spring-sessionen i MongoDB uden Spring Boot.

I lighed med Spring Boot-konfigurationen skal vi bruge spring-session-data-mongodb afhængighed. Men her vil vi bruge spring-data-mongodb afhængighed for at få adgang til vores MongoDB-database:

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-mongodb</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Lad os endelig se, hvordan du konfigurerer applikationen:

@EnableMongoHttpSession
public class HttpSessionConfig {

    @Bean
    public JdkMongoSessionConverter jdkMongoSessionConverter() {
        return new JdkMongoSessionConverter(Duration.ofMinutes(30));
    }
}

@EnableMongoHttpSessionen annotation aktiverer den nødvendige konfiguration for at gemme sessionsdataene i MongoDB .

Bemærk også, at JdkMongoSessionConverter er ansvarlig for at serialisere og deserialisere sessionsdataene.

4. Eksempel på ansøgning

Lad os oprette et program til at teste konfigurationerne. Vi vil bruge Spring Boot, da det er hurtigere og kræver mindre konfiguration.

Vi starter med at oprette controlleren til at håndtere anmodninger:

@RestController
public class SpringSessionMongoDBController {

    @GetMapping("/")
    public ResponseEntity<Integer> count(HttpSession session) {

        Integer counter = (Integer) session.getAttribute("count");

        if (counter == null) {
            counter = 1;
        } else {
            counter++;
        }

        session.setAttribute("count", counter);

        return ResponseEntity.ok(counter);
    }
}

Som vi kan se i dette eksempel, øger vi tæller på hvert hit til slutpunktet og lagring af dets værdi i en sessionsattribut kaldet count .

5. Test af applikationen

Lad os teste applikationen for at se, om vi faktisk er i stand til at gemme sessionsdataene i MongoDB.

For at gøre det, får vi adgang til slutpunktet og inspicerer den cookie, vi modtager. Dette vil indeholde et sessions-id.

Derefter vil vi forespørge MongoDB-samlingen for at hente sessionsdataene ved hjælp af sessions-id'et:

@Test
public void 
  givenEndpointIsCalledTwiceAndResponseIsReturned_whenMongoDBIsQueriedForCount_thenCountMustBeSame() {
    
    HttpEntity<String> response = restTemplate
      .exchange("http://localhost:" + 8080, HttpMethod.GET, null, String.class);
    HttpHeaders headers = response.getHeaders();
    String set_cookie = headers.getFirst(HttpHeaders.SET_COOKIE);

    Assert.assertEquals(response.getBody(),
      repository.findById(getSessionId(set_cookie)).getAttribute("count").toString());
}

private String getSessionId(String cookie) {
    return new String(Base64.getDecoder().decode(cookie.split(";")[0].split("=")[1]));
}

6. Hvordan virker det?

Lad os tage et kig på, hvad der foregår i forårssessionen bag kulisserne.

SessionRepositoryFilter er ansvarlig for det meste af arbejdet:

  • konverterer HttpSession ind i en MongoSession
  • tjekker, om der er en cookie tilstede, og hvis det er tilfældet, indlæser sessionsdataene fra butikken
  • gemmer de opdaterede sessionsdata i butikken
  • kontrollerer sessionens gyldighed

Også SessionRepositoryFilter opretter en cookie med navnet SESSION det er HttpOnly og sikkert. Denne cookie indeholder sessions-id'et, som er en Base64-kodet værdi.

For at tilpasse cookienavnet eller egenskaberne skal vi oprette en springbean af typen DefaultCookieSerializer.

For eksempel deaktiverer vi her kun http cookiens ejendom:

@Bean
public DefaultCookieSerializer customCookieSerializer(){
    DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        
    cookieSerializer.setUseHttpOnlyCookie(false);
        
    return cookieSerializer;
}

7. Sessionsdetaljer gemt i MongoDB

Lad os forespørge på vores sessionssamling ved hjælp af følgende kommando i vores MongoDB-konsol:

db.sessions.findOne()

Som et resultat får vi et BSON-dokument, der ligner:

{
    "_id" : "5d985be4-217c-472c-ae02-d6fca454662b",
    "created" : ISODate("2019-05-14T16:45:41.021Z"),
    "accessed" : ISODate("2019-05-14T17:18:59.118Z"),
    "interval" : "PT30M",
    "principal" : null,
    "expireAt" : ISODate("2019-05-14T17:48:59.118Z"),
    "attr" : BinData(0,"rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABdAAFY291bnRzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAC3g=")
}

_id er et UUID, der vil blive Base64-kodet af DefaultCookieSerializer og indstil som en værdi i SESSION cookie. Bemærk også, at attr attribut indeholder den faktiske værdi af vores tæller.


  1. Mongo, find gennem listen over id'er

  2. Lyt efter ændringer i Redis-listen

  3. MongoDB:Der opstod en timeout efter 30.000 ms valg af en server ved hjælp af CompositeServerSelector

  4. Hvorfor betyder indeksretningen noget i MongoDB?