ホームページ  >  記事  >  Java  >  Spring Session と Redis を使用してセッションを共有する方法の紹介

Spring Session と Redis を使用してセッションを共有する方法の紹介

巴扎黑
巴扎黑オリジナル
2017-09-06 09:24:561734ブラウズ

この記事では、Spring、Session、redis を使用してセッションを共有するための関連情報を主に紹介し、サンプルコードを通じて詳しく紹介します。学習や仕事に必要な方は一緒に学習しましょう。以下の編集者。

はじめに

クラスター環境を構築した後、考慮しなければならない問題の 1 つは、ユーザーのアクセスによって生成されたセッションをどのように処理するかです。

セッションを処理するには多くの方法があります。詳細については、再掲された以前のブログを参照してください: クラスター/分散環境における 5 つのセッション処理戦略

ここでは 3 番目の方法であるセッション共有について説明します。

Redis クラスターはマスター/スレーブ レプリケーションを実行し、Redis データベースの結果整合性を使用してセッション情報を Redis に保存します。アプリケーション サーバーは、セッションがローカル メモリにないことを検出すると、redis データベース内で検索します。redis データベースはアプリケーション サーバーから独立したデータベースであるため、セッションは共有され、可用性が高くなります。

短所:

1. Redis は大量のメモリを必要とします。そうしないと、ユーザー セッションがキャッシュから削除されます。

2. キャッシュは定期的に更新する必要があります

初期の構造は次のとおりです:


ただし、この構造にはまだ問題があり、マスターがクラッシュした場合に問題が発生します。場合、redis はマスター切り替えを実行せず、セッション サービスは中断されます。

ただし、最初にこの構造を実現してから、後で最適化して変更しましょう。

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 によってサポートされる実装に置き換えるサーブレット フィルターを作成する役割を果たします


つまり、この構成クラスはフィルターを作成でき、このフィルターは Spring をサポートします。 HttpSession の代わりに機能するセッション。

@EnableRedisHttpSession アノテーションは、Filter を実装する springSessionRepositoryFilter という名前の Spring Bean を作成します。このフィルターは、Spring Session によってサポートされる HttpSession 実装を置き換えるものです。このインスタンスでは、Spring Session は Redis によってサポートされます。 @EnableRedisHttpSession アノテーションは、このフィルターを実装するために springSessionRepositoryFilter の Bean オブジェクトを作成します。 Filter は HttpSession を置き換える役割を果たします。

言い換えれば、

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。