MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Sesi Musim Semi dengan MongoDB

1. Ikhtisar

Dalam tutorial singkat ini, kita akan menjelajahi cara menggunakan Spring Session yang didukung dengan MongoDB, baik dengan dan tanpa Spring Boot.

Spring Session juga dapat didukung dengan toko lain seperti Redis dan JDBC.

2. Konfigurasi Boot Musim Semi

Pertama, mari kita lihat dependensi dan konfigurasi yang diperlukan untuk Spring Boot. Untuk memulai, mari tambahkan versi terbaru spring-session-data-mongodb dan spring-boot-starter-data-mongodb ke proyek kami:

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

Setelah itu, untuk mengaktifkan konfigurasi otomatis Spring Boot, kita perlu menambahkan tipe toko Spring Session sebagai mongodb di application.properties :

spring.session.store-type=mongodb

3. Konfigurasi Pegas Tanpa Boot Pegas

Sekarang, mari kita lihat dependensi dan konfigurasi yang diperlukan untuk menyimpan sesi Spring di MongoDB tanpa Spring Boot.

Mirip dengan konfigurasi Spring Boot, kita memerlukan spring-session-data-mongodb ketergantungan. Namun, di sini kita akan menggunakan spring-data-mongodb ketergantungan untuk mengakses database MongoDB kami:

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

Terakhir, mari kita lihat cara mengkonfigurasi aplikasi:

@EnableMongoHttpSession
public class HttpSessionConfig {

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

@EnableMongoHttpSession anotasi memungkinkan konfigurasi yang diperlukan untuk menyimpan data sesi di MongoDB .

Perhatikan juga bahwa JdkMongoSessionConverter bertanggung jawab untuk membuat serial dan deserializing data sesi.

4. Contoh Aplikasi

Mari buat aplikasi untuk menguji konfigurasi. Kami akan menggunakan Spring Boot, karena lebih cepat dan membutuhkan lebih sedikit konfigurasi.

Kita akan mulai dengan membuat pengontrol untuk menangani permintaan:

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

Seperti yang dapat kita lihat dalam contoh ini, kita menambahkan penghitung pada setiap klik ke titik akhir dan menyimpan nilainya dalam atribut sesi bernama hitung .

5. Menguji Aplikasi

Mari kita uji aplikasi untuk melihat apakah kita benar-benar dapat menyimpan data sesi di MongoDB.

Untuk melakukannya, kami akan mengakses titik akhir dan memeriksa cookie yang akan kami terima. Ini akan berisi id sesi.

Setelah itu, kami akan meminta koleksi MongoDB untuk mengambil data sesi menggunakan id sesi:

@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. Bagaimana Cara Kerjanya?

Mari kita lihat apa yang terjadi di balik layar sesi Musim Semi.

SessionRepositoryFilter bertanggung jawab atas sebagian besar pekerjaan:

  • mengonversi HttpSession menjadi MongoSession
  • memeriksa apakah ada Cookie hadir, dan jika demikian, memuat data sesi dari toko
  • menyimpan data sesi yang diperbarui di toko
  • memeriksa validitas sesi

Juga, SessionRepositoryFilter membuat cookie dengan nama SESSION yaitu HttpOnly dan aman. Cookie ini berisi id sesi, yang merupakan nilai yang disandikan Base64.

Untuk menyesuaikan nama atau properti cookie, kita harus membuat kacang Spring dengan tipe DefaultCookieSerializer.

Misalnya, di sini kami menonaktifkan httponly milik cookie:

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

7. Detail Sesi Disimpan di MongoDB

Mari kita query koleksi sesi kita menggunakan perintah berikut di konsol MongoDB kita:

db.sessions.findOne()

Hasilnya, kita akan mendapatkan dokumen BSON yang mirip dengan:

{
    "_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 adalah UUID yang akan dikodekan Base64 oleh DefaultCookieSerializer dan tetapkan sebagai nilai di SESSION Kue kering. Juga, perhatikan bahwa attr atribut berisi nilai sebenarnya dari penghitung kami.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara menentukan Order atau Sort menggunakan driver C# untuk MongoDB?

  2. Di mongoDb, bagaimana Anda menghapus elemen array dengan indeksnya?

  3. Hasil MapReduce tampaknya terbatas pada 100?

  4. SchemaType mana di Mongoose yang Terbaik untuk Timestamp?

  5. MongoDB $setIsSubset