この記事では、Spring、Session、redis を使用してセッションを共有するための関連情報を主に紹介し、サンプルコードを通じて詳しく紹介します。学習や仕事に必要な方は一緒に学習しましょう。以下の編集者。
はじめに
クラスター環境を構築した後、考慮しなければならない問題の 1 つは、ユーザーのアクセスによって生成されたセッションをどのように処理するかです。
セッションを処理するには多くの方法があります。詳細については、再掲された以前のブログを参照してください: クラスター/分散環境における 5 つのセッション処理戦略
ここでは 3 番目の方法であるセッション共有について説明します。
Redis クラスターはマスター/スレーブ レプリケーションを実行し、Redis データベースの結果整合性を使用してセッション情報を Redis に保存します。アプリケーション サーバーは、セッションがローカル メモリにないことを検出すると、redis データベース内で検索します。redis データベースはアプリケーション サーバーから独立したデータベースであるため、セッションは共有され、可用性が高くなります。
短所:
1. Redis は大量のメモリを必要とします。そうしないと、ユーザー セッションがキャッシュから削除されます。
2. キャッシュは定期的に更新する必要があります
初期の構造は次のとおりです:
Spring Boot は、セッション共有を完了するための Spring Session を提供します。
公式ドキュメント: http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html#boot-sampleまず単純なコントローラーを作成します:
@Controller public class UserController { @RequestMapping(value="/main", method=RequestMethod.GET) public String main(HttpServletRequest request) { HttpSession session = request.getSession(); String sessionId = (String) session.getAttribute("sessionId"); if (null != sessionId) { // sessionId不为空 System.out.println("main sessionId:" + sessionId); return "main"; } else { // sessionId为空 return "redirect:/login"; } } @RequestMapping(value="/login", method=RequestMethod.GET) public String login() { return "login"; } @RequestMapping(value="/doLogin", method=RequestMethod.POST) public String doLogin(HttpServletRequest request) { System.out.println("I do real login here"); HttpSession session = request.getSession(); String sessionId = UUID.randomUUID().toString(); session.setAttribute("sessionId", sessionId); System.out.println("login sessionId:" + sessionId); return "redirect:/main"; } }簡単に言うと、sessionIdが存在する場合はホームページにアクセスし、存在しない場合はログインページにジャンプします。
では、セッション共有を実現するにはどうすればよいでしょうか?
次の依存関係を追加します:
<!-- spring session --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.3.0.RELEASE</version> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
構成クラスを追加します:
@EnableRedisHttpSession public class HttpSessionConfig { @Bean public JedisConnectionFactory connectionFactory() { return new JedisConnectionFactory(); } }
この構成クラスの用途は何ですか?
公式ドキュメント: Spring 構成は、HttpSession 実装を Spring Session によってサポートされる実装に置き換えるサーブレット フィルターを作成する役割を果たしますHttpSession は役割を果たさなくなり、redis を使用してフィルターを通じてセッションを直接操作します。
application.propertiesにredisの設定を追加します:
spring.redis.host=localhost spring.redis.password= spring.redis.port=6379
これでセッション共有が完了します。シンプルではないでしょうか?ビジネスコードには少しの変更も必要ありません。
検証:
Redis データベースは最初は空です。
プロジェクトを実行します:ページにアクセスすると、redis でセッション情報を確認できます。
何気なくログインした後:メインに入ります。これは、現在のセッションに sessionId が存在することを意味します。
現在のページの Cookie をチェックします。つまり、この Cookie には sessionId が含まれています。ポート 8081 で新しいプロジェクトを実行します。元のブラウザで新しいタブを直接開きます。現時点では Cookie が共有されていることがわかっています。 localhost:8081/main にアクセスしてください
新しいプロジェクトに直接アクセスできました! !同じ Cookie を使用して、異なる Web サーバーでセッションを共有できます。
最後にもう一度強調します:
HttpSession の実装は Spring Session に置き換えられます。HttpSession の操作は、redis でのデータの操作と同等です。
以上がSpring Session と Redis を使用してセッションを共有する方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。