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 属性には、カウンターの実際の値が含まれています。