MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Spring Session mit MongoDB

1. Übersicht

In diesem kurzen Tutorial untersuchen wir, wie Sie die von MongoDB unterstützte Spring Session sowohl mit als auch ohne Spring Boot verwenden können.

Spring Session kann auch mit anderen Stores wie Redis und JDBC unterstützt werden.

2. Spring Boot-Konfiguration

Sehen wir uns zunächst die Abhängigkeiten und die für Spring Boot erforderliche Konfiguration an. Lassen Sie uns zunächst die neuesten Versionen von spring-session-data-mongodb hinzufügen und spring-boot-starter-data-mongodb zu unserem 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>

Danach müssen wir, um die automatische Spring Boot-Konfiguration zu aktivieren, den Speichertyp Spring Session als mongodb hinzufügen in der application.properties :

spring.session.store-type=mongodb

3. Spring-Konfiguration ohne Spring Boot

Werfen wir nun einen Blick auf die Abhängigkeiten und die Konfiguration, die zum Speichern der Spring-Sitzung in MongoDB ohne Spring Boot erforderlich sind.

Ähnlich wie bei der Spring Boot-Konfiguration benötigen wir die spring-session-data-mongodb Abhängigkeit. Hier verwenden wir jedoch die spring-data-mongodb Abhängigkeit für den Zugriff auf unsere MongoDB-Datenbank:

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

Lassen Sie uns abschließend sehen, wie die Anwendung konfiguriert wird:

@EnableMongoHttpSession
public class HttpSessionConfig {

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

Die @EnableMongoHttpSession Annotation ermöglicht die Konfiguration, die zum Speichern der Sitzungsdaten in MongoDB erforderlich ist .

Beachten Sie außerdem, dass der JdkMongoSessionConverter ist für die Serialisierung und Deserialisierung der Sitzungsdaten verantwortlich.

4. Beispielanwendung

Lassen Sie uns eine Anwendung erstellen, um die Konfigurationen zu testen. Wir verwenden Spring Boot, da es schneller ist und weniger Konfiguration erfordert.

Wir beginnen mit der Erstellung des Controllers zur Bearbeitung von Anfragen:

@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);
    }
}

Wie wir in diesem Beispiel sehen können, erhöhen wir counter bei jedem Treffer zum Endpunkt und speichert seinen Wert in einem Sitzungsattribut namens count .

5. Testen der Anwendung

Lassen Sie uns die Anwendung testen, um zu sehen, ob wir die Sitzungsdaten tatsächlich in MongoDB speichern können.

Dazu greifen wir auf den Endpunkt zu und untersuchen das Cookie, das wir erhalten. Diese enthält eine Sitzungs-ID.

Danach fragen wir die MongoDB-Sammlung ab, um die Sitzungsdaten mit der Sitzungs-ID abzurufen:

@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. Wie funktioniert es?

Werfen wir einen Blick darauf, was hinter den Kulissen der Spring Session vor sich geht.

Der SessionRepositoryFilter ist für den größten Teil der Arbeit verantwortlich:

  • konvertiert die HttpSession in eine MongoSession
  • überprüft, ob ein Cookie vorhanden ist vorhanden und lädt ggf. die Sitzungsdaten aus dem Store
  • speichert die aktualisierten Sitzungsdaten im Store
  • überprüft die Gültigkeit der Sitzung

Auch der SessionRepositoryFilter erstellt ein Cookie mit dem Namen SESSION das ist HttpOnly und sicher. Dieses Cookie enthält die Sitzungs-ID, die ein Base64-codierter Wert ist.

Um den Cookie-Namen oder die Eigenschaften anzupassen, müssen wir eine Spring-Bean vom Typ DefaultCookieSerializer. erstellen

Hier deaktivieren wir zum Beispiel httponly Eigenschaft des Cookies:

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

7. In MongoDB gespeicherte Sitzungsdetails

Lassen Sie uns unsere Sitzungssammlung mit dem folgenden Befehl in unserer MongoDB-Konsole abfragen:

db.sessions.findOne()

Als Ergebnis erhalten wir ein BSON-Dokument ähnlich dem:

{
    "_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=")
}

Die _id ist eine UUID, die vom DefaultCookieSerializer Base64-kodiert wird und als Wert in SESSION gesetzt Plätzchen. Beachten Sie außerdem, dass das attr Attribut enthält den aktuellen Wert unseres Zählers.