実際のユーザーログイン、セッション検証、分散ストレージセッション

実際のユーザーログイン、セッション検証、分散ストレージセッション

[[385945]]

ログイン機能の実装

次に、login.css を作成し、スタイル ID をコンテンツとして、static の下の css ディレクトリに保存します。

  1. #コンテンツ {
  2. マージン: 220px;
  3. マージン:1420px;
  4. マージン: 100px;
  5. マージン下部: 自動;
  6. 背景色: オレンジ;
  7. }

login.htmlログインページを作成する

  1. <!DOCTYPE html>
  2. <html lang= "zh" xmlns:th= "http://www.thymeleaf.org" >
  3. <ヘッド>
  4. <メタ文字セット= "UTF-8" >
  5. <title>ログイン</title>
  6. <! -- ローカル CSS ファイルをインポートする方法 -->  
  7. <link rel= "スタイルシート" th:href= "@{/css/login.css}" />
  8. </head>
  9. <本文>
  10. <div id= "コンテンツ" >
  11. <! -- エラーはプロンプトです -->  
  12. <label id= "errorMsg" style= "color: 深紅" >[[${errorMsg}]]</label>
  13. <フォーム id= "ログインフォーム"  アクション= "/login"メソッド = "post" >
  14. 名前: <input type= "text" id= "uname"  名前= "uname" ><br/>
  15. パスワード: <input type= "password" id= "password"  名前= "パスワード" ><br/>
  16. <button onclick= "login()" >ログイン</button>
  17. </フォーム>
  18. </div>
  19. </本文>
  20. </html>

前の部分はフロントエンドです。バックエンドのコードを書き終えましょう。

UserRepository に次のメソッド定義を追加します。

  1. //ユーザー名とパスワードでユーザーを検索
  2. リスト<ユーザー> findByUnameAndPassword(String uname, String password );

UserService および実装クラスに次のメソッドが追加されます。

  1. / ユーザー名とパスワードでユーザーを検索する
  2. リスト<ユーザー> findByUnameAndPassword(String uname, String password );
  3. UserService および実装クラスに次のメソッドが追加されます。
  4.  
  5. // ユーザーサービス
  6. ユーザーログイン(ユーザー ユーザー);
  7.  
  8. @サービス
  9. //クラスにトランザクションアノテーションを配置します。これにより、以下のメソッドで毎回このアノテーションを記述する必要がなくなります。
  10. @Transactional(ロールバックFor = Exception.class)
  11. パブリッククラス UserServiceImpl は UserService を実装します {
  12. //.......
  13. @オーバーライド
  14. 公共 ユーザーログイン(ユーザー ユーザー) {
  15. リスト<ユーザー> userList = userRepository.findByUnameAndPassword( user .getUname(), user .getPassword());
  16. // 複数のユーザーが同じユーザー名とパスワードを使用するのを防ぐ
  17. CollectionUtils.isEmpty(userList) の場合 {
  18. userList.get(0)を返します
  19. }
  20. 戻る ヌル;
  21. }
  22. }

UserController に次のメソッドを追加します。

  1. @RequestMapping(値 = "/loginPage" 、メソッド = RequestMethod.GET)
  2. パブリック文字列ログインページ(モデルモデル) {
  3. 戻る  "ログイン" ;
  4. }
  5.  
  6. @RequestMapping(値 = "/login" 、メソッド = RequestMethod.POST)
  7. パブリック文字列ログイン(モデルモデル、ユーザー ユーザー) {
  8. ユーザー結果 = userService.login( user );
  9. 結果がnull場合
  10. //ログイン成功、ユーザーリストへジャンプ
  11. 戻る  「リダイレクト:/userList」 ;
  12. }
  13. //失敗、プロンプト
  14. model.addAttribute( "errorMsg" , "ユーザー名またはパスワードが正しくありません" );
  15. 戻る  "ログイン" ;
  16. }

プロジェクトを開始するには、

http://localhost:8080/ログインページ

ログインページに移動します。

ユーザー名とパスワードを入力してください。パスワードが間違っています:

正しいユーザー名とパスワードを入力すると、ユーザー リストにリダイレクトされます。

このようにして、シンプルなログイン機能が実現します。

ユーザー情報を変更するときに、ログインしているかどうかを確認する必要がある場合はどうすればよいですか?

インターセプター

カスタム インターセプターを作成し、HandlerInterceptor インターフェイスを実装します。

  1. org.springframework.lang.Nullable をインポートします。
  2. org.springframework.web.servlet.HandlerInterceptor をインポートします。
  3. org.springframework.web.servlet.ModelAndView をインポートします。
  4.  
  5. javax.servlet.http.HttpServletRequest をインポートします。
  6. javax.servlet.http.HttpServletResponse をインポートします。
  7.  
  8. パブリッククラス SessionInterceptor は HandlerInterceptor を実装します {
  9. @オーバーライド
  10. public boolean preHandle(HttpServletRequest リクエスト、HttpServletResponse レスポンス、オブジェクト ハンドラ) 例外をスローします {
  11. //セッション検証
  12. オブジェクト object = request.getSession().getAttribute( "users" );
  13. if ( null == オブジェクト) {
  14. response.sendRedirect( "/ログインページ" );
  15. 戻る 間違い;
  16. }
  17. 戻る 真実;
  18. }
  19. }

WebMvcConfiguraeAdapter を継承し、addInterceptor メソッドをオーバーライドする Java クラスを作成します (このクラスは、構成インターセプターを追加し、このクラスに構成インターセプターを追加し、フィルタリングを構成するために使用されます)。

  1. org.springframework.context.annotation.Configuration をインポートします。
  2. org.springframework.web.servlet.config.annotation.InterceptorRegistry をインポートします。
  3. org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter をインポートします。
  4.  
  5. @構成
  6. パブリッククラス MyInterceptor は WebMvcConfigurerAdapter を拡張します {
  7.  
  8. @オーバーライド
  9. パブリックvoid addInterceptors(InterceptorRegistry レジストリ) {
  10. //複数のインターセプションを追加できます
  11. レジストリにInterceptorを追加します(新しいSessionInterceptor())
  12. //複数のインターセプトパスを追加することもできます。 "/**" はすべてのインターセプトを行います
  13. .addPathPatterns( "/update/**" );
  14. }
  15. }

次に、ログイン コントローラー メソッドを調整し、セッション情報を保存します。

  1. @RequestMapping(値 = "/login" 、メソッド = RequestMethod.POST)
  2. パブリック文字列ログイン(モデルモデル、ユーザー ユーザー、HttpServletRequest リクエスト) {
  3. ユーザー結果 = userService.login( user );
  4. 結果がnull場合
  5. //ユーザー情報はセッションに保存されます
  6. リクエスト.getSession().setAttribute( "users" user .getUname());
  7. 戻る  「リダイレクト:/userList」 ;
  8. }
  9. model.addAttribute( "errorMsg" , "ユーザー名またはパスワードが正しくありません" );
  10. 戻る  "ログイン" ;
  11. }

ユーザー リストに再度アクセスします。

http://localhost:8080/ユーザーリスト

このとき、ユーザー情報を変更する機能にアクセスし、ログインページにジャンプします。

ログイン後、再度ユーザー情報の変更機能にアクセスしてください。

これにより、ユーザー情報の変更ページが表示されます。

この時点で、検証を受信するための簡単なセッションを実装しました。

サーバーが再起動されると、セッションはサーバー上に保存され、サーバー メモリ内に残っているため、セッションは失われます。

セッション分散には4つのソリューションがあります

ソリューション 1: クライアント ストレージ

情報をクッキーに直接保存します。 Cookie はクライアントに保存される小さなデータです。クライアントは http プロトコルを介してサーバーと対話し、通常は機密性のない情報を保存するために使用されます。

欠点

  • データはクライアントに保存されるため、セキュリティ上のリスクが生じます。
  • クッキーの保存サイズと種類には制限があります。
  • データはクッキーに保存されます。クッキーのサイズが大きすぎると、ネットワークにさらにオーバーヘッドが追加されます。

解決策2: セッションレプリケーション

セッション レプリケーションは、小規模なエンタープライズ アプリケーションで広く使用されているサーバー クラスター セッション管理メカニズムです。実際の開発では広く使用されていません。これは、Web サーバー (Tomcat など) 用のクラスターを構築することによって実現されます。

欠点

セッション同期の原理は、同じ LAN 内でブロードキャストを送信することにより、セッションを非同期的に同期することです。サーバーの数が増え、それらが同時に接続されると、セッションで同期する必要があるデータの量が多くなります。他のサーバー上のすべてのセッションをこのサーバーに同期する必要があり、これにより一定のネットワーク オーバーヘッドが発生します。特にユーザー数が多い場合はメモリ不足が発生する場合があります。

アドバンテージ

サーバー間のセッション情報は同期されます。いずれかのサーバーがダウンしても、他のサーバーのセッションの状態には影響しません。構成は比較的シンプルです。

Tomcat はすでに分散アーキテクチャの開発および管理メカニズムをサポートしています。 Tomcat の設定を変更してセッション レプリケーションをサポートし、クラスター内の複数のサーバー間でセッション オブジェクトを同期して、各サーバーがすべてのユーザーのセッション情報を保存できるようにすることができます。この方法では、ローカル マシンのダウンタイムによってセッション データが失われることはなく、サーバーがセッションを使用する場合は、ローカル マシン上でセッションを取得するだけで済みます。

設定方法は?

Tomcat インストール ディレクトリの下の config ディレクトリにある server.xml ファイルで、コメントを開きます。 Tomcat は同じゲートウェイに存在する必要があります。そうでない場合、ブロードキャストを受信できず、セッションを同期できません。 web.xml でセッション レプリケーションを有効にします。

解決策3: セッションバインディング:

Nginxは、無料のオープンソースの高性能HTTPサーバーおよびリバースプロキシサーバーです。

Nginx で何ができるのでしょうか?

リバースプロキシ、負荷分散、http サーバー (動的および静的プロキシ)、フォワードプロキシ

セッションバインディングに nginx を使用する方法

nginx のリバース プロキシと負荷分散を使用します。以前は、クライアントは処理のためにいずれかのサーバーに割り当てられていました。割り当てられる特定のサーバーは、サーバーの負荷分散アルゴリズム (ポーリング、ランダム、IP ハッシュ、重みなど) によって異なります。ただし、nginx の ip-hash 戦略に基づいてクライアントとサーバーをバインドすることはできます。このサーバーには同じクライアントのみがアクセスでき、クライアントが何度リクエストを送信しても、同じサーバーによって処理されます。

欠点

単一障害点が発生しやすくなります。 1 台のサーバーがダウンすると、そのサーバー上のセッション情報は失われます。

フロントエンドでは負荷分散を行うことができません。そうすると、セッションバインディングに問題が生じます

アドバンテージ

  • シンプルな構成

ソリューション4: Redisベースのセッションストレージソリューション

アドバンテージ

  • これは企業で最も一般的に使用される方法です
  • Springはspring-sessionをパッケージ化しているので、依存関係を導入するだけで済みます。
  • データはRedisに保存され、シームレスにアクセスでき、セキュリティリスクはありません。
  • Redis自体はクラスターとして使用でき、マスタースレーブを構築でき、管理が簡単です。

欠点

もう 1 つのネットワーク呼び出しがあり、Web コンテナーは Redis にアクセスする必要があります。

通常、Web コンテナが配置されているサーバーと Redis が配置されているサーバーは、ネットワークのオーバーヘッドを削減し、イントラネットを介して接続するために、同じコンピュータ ルームに配置されます。

出典: http://45dwz.com/xeP0J

Redis ベースの分散ストレージ セッション ソリューションの実装

ここではRedisのインストール方法については説明しません。インストール方法が分からない場合はご連絡ください。

Redis 統合

依存関係の追加

  1. <依存関係>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </依存関係>
  5. <! -- 接続プール -->  
  6. <依存関係>
  7. <グループ ID>org.apache.commons</グループ ID>
  8. <artifactId>コモンズプール2</artifactId>
  9. </依存関係>
  10. <依存関係>
  11. <groupId>org.springframework.session</groupId>
  12. <artifactId>spring-session-data-redis</artifactId>
  13. </依存関係>

Redis設定を追加する

  1. # Redis データベース インデックス (デフォルトは 0)
  2. spring.redis.データベース= 0
  3. # Redis サーバーのアドレス
  4. spring.redis.ホスト=127.0.0.1
  5. # Redis サーバー接続ポート
  6. spring.redis.port=6379
  7. # Redis サーバー接続パスワード (デフォルトでは空)
  8. spring.redis.パスワード=
  9. # 接続プール内の最大接続数(制限がない場合は負の値を使用します)
  10. spring.redis.jedis.pool.max -アクティブ=20
  11. # 接続プールの最大ブロッキング待機時間(制限なしを示すには負の値を使用します)
  12. spring.redis.jedis.pool.max -wait =-1
  13. # 接続プール内のアイドル接続の最大数
  14. spring.redis.jedis.pool.max -idle =10
  15. # 接続プール内のアイドル接続の最小数
  16. spring.redis.jedis.pool です。最小アイドル=0
  17. # 接続タイムアウト(ミリ秒)
  18. タイムアウト=1000

Redisにセッションを追加する

スタートアップ クラスに @EnableRedisHttpSession アノテーションを追加します。

  1. @SpringBootアプリケーション
  2. @RedisHttpSession を有効にする
  3. パブリッククラスアプリケーション{
  4. 公共 静的void main(String[] args) {
  5. SpringApplication.run(Application.class、引数);
  6. }
  7. }

プロジェクトを開始し、再度ログインするとRedisで見つかります

プロジェクトを再度再起動したところ、ユーザー情報を変更するときに再度ログインする必要がないことがわかりました。

この時点で、Redis 分散ストレージ セッション ソリューションは完了です。

要約する

この記事では、まずログイン機能を実装し、次に検証セッションのインターセプト処理を実装し、次に 4 つのセッション分散ソリューションをまとめ、最後に Redis セッション ストレージに基づくソリューションを実装します。

この記事はWeChat公開アカウント「Java Backend Technology Full Stack」から転載したものです。以下のQRコードからフォローできます。この記事を転載する場合は、Java Backend Technology Full Stack パブリック アカウントにお問い合わせください。

<<:  Hongmeng HarmonyOS 開発中の分散フロー開発における一般的なエラーに関する FAQ

>>:  ハイブリッド マルチクラウドの旅におけるビジネス継続性

推薦する

SAP はテクノロジーを活用してスポーツ界に力を与え、新疆の若者がサッカーの夢を実現できるよう支援します

本日、新疆サッカー協会のリーダーシップ交代とスマート青少年トレーニング開始会議において、SAP は新...

無料クラウド ストレージ プロバイダー トップ 5

[51CTO.com クイック翻訳] ご存知のとおり、クラウド ストレージは、どこからでもタイムリー...

OpenHarmony 分散ソフトバスプロセス分析 v1.0丨1。発見終了、リリースサービス

[[408690]]詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したH...

グループ購入モデルをどのように革新すれば、収益性を高め、投資を引き付けることができるでしょうか?

2011 年に急成長を遂げた後、共同購入 Web サイトは 2012 年に重要な時期を迎えました。現...

知湖の若者の悩み:国内のトラブルと海外の敵、ユーザーは愛を失っている

【はじめに】「中国のQuora」と呼ばれる知乎は、李開復氏に代表されるITオピニオンリーダーの支援を...

ロシアのVPS: justhost、VPSと専用サーバーおよび機器ホスティングを提供

2006 年に設立されたロシアのホスティング会社 justhost は、一定の評判を誇っています。J...

タオバオの売り手は新しい本を出版できないと言う:Tmallは肉を食べ、スープを飲む

同じ新刊本、Tmallの売り手は販売できるが、私はできないITタイムズ 楊新傑朝、蒸し器から取り出し...

解釈:ALT属性値は検索エンジンにとってまだ有効ですか?

画像のALT属性値を最適化することが検索エンジンにとってまだ有用であるかどうかについて、オンラインで...

サイト上で効率的なアンカーテキストマップを構築する方法について説明します

サイト内アンカーテキストは、Web サイトの成熟度を示すものです。サイト内アンカーテキストの量は、W...

speedykvm - $31/年/KVM/Win/1g メモリ/50g ハードディスク/5T トラフィック

speedykvm は、「Volatile」と呼ばれる新しいタイプの VPS を開始しました。通常の...

hurricanedigital: 台湾 VPS、動的 IP/静的 IP、月額 330 元、600M 帯域幅、無制限のトラフィック

Hurricanedigital は台湾 VPS を提供しており、台湾動的 IP VPS と台湾静的...

#おすすめ# hosteons: 30% オフ - 無制限トラフィック VPS、KVM+Windows/ロサンゼルス データセンター

Hosteons は、これまでで最高の 30% 割引のマジック コードをリリースしました。ロサンゼル...

分散IM(インスタントメッセージング)システムを自分で構築する

以前、「*** のメッセージ プッシュ システムの設計」という記事を共有しました。記事にはいくつかの...

arkecx: ワシントン D.C. (首都) データセンターのクラウド サーバー評価

arkecxはどうですか?ワシントン DC の VPS やクラウド サーバーはめったに見られないよう...

westplainshosting-1.5 USD/KVM/512 MB RAM/15 GB HDD/1 TB トラフィック/アトランタ

westplainshosting.com は、米国に登録された新しい VPS 販売業者です。主に ...