sql >> データベース >  >> NoSQL >> MongoDB

MongoDBとの春のセッション

    1。概要

    このクイックチュートリアルでは、Spring Bootを使用する場合と使用しない場合の両方で、MongoDBを使用したSpringSessionの使用方法を探ります。

    Spring Sessionは、RedisやJDBCなどの他のストアでバックアップすることもできます。

    2。スプリングブート構成

    まず、SpringBootに必要な依存関係と構成を見てみましょう。まず、最新バージョンの spring-session-data-mongodbを追加しましょう。 およびspring-boot-starter-data-mongodb 私たちのプロジェクトへ:

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

    その後、Spring Bootの自動構成を有効にするには、SpringSessionストアタイプをmongodbとして追加する必要があります。 application.properties内 :

    spring.session.store-type=mongodb

    3。スプリングブートなしのスプリング構成

    それでは、SpringBootなしでSpringセッションをMongoDBに保存するために必要な依存関係と構成を見てみましょう。

    Spring Boot構成と同様に、 spring-session-data-mongodbが必要です。 依存。ただし、ここでは spring-data-mongodbを使用します MongoDBデータベースにアクセスするための依存関係:

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

    最後に、アプリケーションを構成する方法を見てみましょう。

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

    @ EnableMongoHttpSession アノテーションにより、セッションデータをMongoDBに保存するために必要な構成が可能になります

    また、 JdkMongoSessionConverter セッションデータのシリアル化と逆シリアル化を担当します。

    4。アプリケーションの例

    構成をテストするためのアプリケーションを作成しましょう。より高速で構成が少なくて済むため、SpringBootを使用します。

    まず、リクエストを処理するコントローラーを作成します。

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

    この例でわかるように、カウンターをインクリメントしています。 エンドポイントにヒットするたびに、その値を countという名前のセッション属性に格納します 。

    5。アプリケーションのテスト

    アプリケーションをテストして、セッションデータを実際にMongoDBに保存できるかどうかを確認しましょう。

    そのために、エンドポイントにアクセスし、受信するCookieを検査します。これにはセッションIDが含まれます。

    その後、MongoDBコレクションにクエリを実行して、セッションIDを使用してセッションデータをフェッチします。

    @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。どのように機能しますか?

    舞台裏で春のセッションで何が起こっているか見てみましょう。

    SessionRepositoryFilter ほとんどの作業を担当します:

    • HttpSessionを変換します MongoSession
    • Cookieがあるかどうかを確認します 存在し、存在する場合は、ストアからセッションデータをロードします
    • 更新されたセッションデータをストアに保存します
    • セッションの有効性を確認します

    また、 SessionRepositoryFilter SESSIONという名前のCookieを作成します それはHttpOnlyで安全です。このCookieには、Base64でエンコードされた値であるセッションIDが含まれています。

    Cookieの名前またはプロパティをカスタマイズするには、DefaultCookieSerializerタイプのSpringBeanを作成する必要があります。

    たとえば、ここでは httponlyを無効にしています Cookieのプロパティ:

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

    7。 MongoDBに保存されているセッションの詳細

    MongoDBコンソールで次のコマンドを使用してセッションコレクションをクエリしてみましょう:

    db.sessions.findOne()

    その結果、次のようなBSONドキュメントが作成されます。

    {
        "_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 DefaultCookieSerializerによってBase64でエンコードされるUUIDです。 SESSIONで値として設定します クッキー。また、 attr 属性には、カウンターの実際の値が含まれています。


    1. 最高のMongoDBGUIはどれですか? —2019アップデート

    2. MongoDB $ push

    3. mongoシェル内でMongoクエリ出力をファイルに出力する

    4. PooledRedisClientManagerが接続を解放しない