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

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

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

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

推薦する

1ヶ月半で人気キーワードがホームページの2位に躍り出た

諺にあるように、困難な時代に英雄が現れる。百度のランダムKの時代には、小さなウェブサイトが台頭するチ...

電子商取引業者は愚かなほどマーケティングに熱中するのをやめるべき

中国は特殊な市場です。当社の製品販売はまさに、製品の本質よりもマーケティングが重要になる段階に達して...

起業から上場まで、Chubao CTO の Wang Jian が AWS との 10 年間の取り組みについて語る

[51CTO.comより引用] モバイルインターネットの時代において、多くの中国の起業家企業が海外に...

Baidu は Baidu SEO をますます SEO らしくないものにしている

始める前に、まず SEO についての私の理解についてお話ししたいと思います。 SEOとは何でしょうか...

Kafka はなぜこんなに速いのでしょうか?

ソフトウェア アーキテクチャの分野はここ数年で劇的に変化しました。すべてのシステムが単一のデータベー...

ウェブサイトのSEOではいくつかの誤解に注意する必要がある

検索エンジンの発展に伴い、企業は徐々にオンライン市場に注目するようになり、多くの企業が独自の企業ウェ...

卸売インターネットサーバー - 10 ドルから / 1 億台無制限 / カンザス

wholesaleinternet は、独自のコンピューター ルーム (カンザス)、独自のハードウェ...

TSMCの「ウイルスゲート」から次世代クラウドデスクトップセキュリティ保護の新しいアイデアについて語る

メディアの報道によると、8月3日夕方、世界有数のウエハーファウンドリーであるTSMCは、台湾の新竹サ...

Cloudive 簡単レビュー - [メモリ2g/月額7ドル]

Gongyi は、シカゴにデータセンターがある Cloudive から特別版の 2G メモリ KVM...

KubeSphereはForresterレポートで選ばれ、「フルスタックコンテナプラットフォーム」として評価されました

Forrester Researchは最近、「Now Tech: 中国のエンタープライズ コンテナ ...

週刊ニュースレビュー:業界から疑問視される12306ウェブサイト 蘇寧によるRedbaby買収

1. 鉄道省による3億3000万元の入札の裏側:バックエンド技術に業界から疑問の声ITソフトウェアシ...

諸葛亮 vs. 龐統、Distributed Paxos の勝利

[[375586]]序文配布は確かに興味深いトピックです。注意して見ていれば、生活のいたるところに分...

中国国際航空のウェブサイトのシステム障害により、乗客が無料で航空券を購入した。当局は無料航空券は有効だと述べている。

本紙(劉暁旭記者、謝雲青記者)は、7月10日夜、中国国際航空のウェブサイトシステムが一時的に故障した...

#ニュース# Hosteons はすべての OpenVZ 仮想 VPS を KVM に無料で変換することを決定しました

Hosteons は、「すべての OpenV 仮想 VPS が KVM に無料で移行される」ことを公...

パンデミック中のeコマースライブストリーミングの変化

疫病の影響で、ほとんどの人が自宅で仕事や休暇を取らざるを得なくなり、オフラインでは満たせないニーズが...