改善(構文ベース&DBをセッションストレージとして使用)
5969 ワード
このプレゼンテーションは、Spring BootとAWSが独自にWebサービスマニュアルに基づいて作成したものです.
1.音声ベース
ex)IndexControllerのセッション値をメソッドパラメータを使用して直接セッション値を取得する部分 に変更する.
ⓐ @Target(ElementType.PARAMETER) 対応するヘルパー を作成する場所を指定します. PARAMETERが指定されており、メソッドパラメータとして宣言されたオブジェクトのみ使用可能です. ElementType.PACKAGE:包装声明 ElementType.TYPE:タイプ宣言 ElementType.ANNOTATION TYPE:声明声明声明声明声明は ElementType.CONTRUCTOR:宣言作成者 ElementType.FIELD: メンバー変数宣言 ElementType.LOCAL VARIABLE: 地域変数宣言 ElementType.METHOD:メソッド宣言 ElementType.PARAMETER: 転送ファクタ宣言 ElementType.TYPE PARAmTER:転送係数タイプ宣言 ElementType.TYPE USE:タイプ宣言 ⓑ @Retention(RetentionPolicy.RUNTIME) Annotationの実際の応用とメンテナンス範囲は である. RetentionPolicy.RUNTIME のコンパイル後も、JVMは を参照し続けることができます.は主にコピーまたは記録 に用いられる.
RetentionPolicy.CLASS コンパイラがクラスを参照する場合有効 RetentionPolicy.SOURCE をコンパイルする前にのみ有効な 、すなわちコンパイル後に消失する ⓒ @interface ファイルを として指定(作成)
ⓐ supportsParameter() コントローラメソッドの特定のパラメータ がサポートされているかどうかを決定する.の上記の方法では、パラメータに@LoginUser宣言があり、パラメータクラスタイプはSessionUserである.クラスはtrueを返します( )
ⓑ resolveArgument() パラメータに渡すオブジェクト を作成します.以上のソースがセッションからオブジェクト にインポートする.
ⓐ @LoginUser SessionUser user 既存SessionUser=(SessionUser)httpSession.getAttribute("user");セッション情報の読み込み値が向上する セッション情報 は、対応するカスタム名を使用して取得することができる.
2.セッション・リポジトリとしてデータベースを使用する
クライアントとWebサーバとの間のネットワーク接続は継続する、 .、すなわち、ユーザがブラウザを開くサーバに接続し、接続を閉じる時点 である. HTTPプロトコルは非接続プロトコルであり、各接続には新しいネットワーク接続があり、セッションは接続を維持することができ、 .情報はサーバ側に格納されており、Cookieよりもセキュリティ面で優れている
(参照:https://hyuntaeknote.tistory.com/6) Sticky Session (Load Balancer) セッションクラスタ(TOMCATセッション) Session Storage ディスク・ライブラリ(MySQL、Oracle、MS-SQLなどのリレーショナル・データベース) メモリデータベース(Redis、Memcachedなど) 固定セッション Load Balanceは基本的にループ方式で流量 を分配する.は、 によってトラフィックを処理し、ユーザが接続を試みたときに初期接続のサーバに接続を継続する.の利点 ユーザは、セッション中に同じサーバ のみを使用する.コンシステンシ問題から解放された の欠点 ユーザが接続する必要があるサーバのため、トラフィックが特定のサーバに集中するリスクは である.ユーザは、自分のセッションを持たない他のサーバ を使用できない.可用性低下
は、複数のコンピュータを1つのシステムのように動作させる. WASは、2つ以上のインストール時に同じセッションとして管理されます.これは、 を意味します.の利点 セッションをコピーしてセッションにデータをコピーすることで、コンシステンシの問題 を解決する.
1台のサーバに障害が発生しても、サービスは を実行できます.
の欠点 すべてのサーバは同じセッションオブジェクトを持つ必要があります.そのため、大量のメモリ が必要です.セッションリポジトリにデータを格納するたびに、 の値をすべてのサーバに入力する必要があります.サーバの数に比例して、ネットワークトラフィックの増加などのパフォーマンスの低下
サーバをいくら増やしても、各サーバにセッション格納に関する情報を入力すれば、セッション を共有することができる.流量異常凝集現象を考慮する必要はない .サーバは、障害が発生した場合でも、 のサービスを継続できます.複数のサーバが1つのセッションを使用することによってデータが不一致になる(コンシステンシの問題を解決する) .パフォーマンスの問題を解決するために、個別のセッションコピーを必要としない But;セッション・ストレージ・サーバの障害を回避するために、同じセッション・リポジトリでコピーすることを推奨 Disk Based Database ディスクストレージおよび使用 MySQL、Oracle、MS-SQLなどのリレーショナル・データベース セッション・リポジトリを使用する最も簡単な方法 あまり設定する必要はありません の処理速度が遅いため、データベースI/Oによるパフォーマンスの問題が発生する可能性がある .は、ディスク・ベースのデータベースのI/O速度が比較的遅い頻繁な読み取り/書き込みセッション・リポジトリです. は、通常、あまりログイン要求を必要としないバックグラウンドオフィスであり、内部システム によく使用される.
In-Memory Database メモリにおける の格納と使用 Redis、Memcached等 セッションに格納データは、永続的に格納データではなく、 である.メモリ・データベースは、電源オフ時にデータが失われますが、セッション・ストレージに格納されるデータは比較的少ないため、メモリ・データベースの使用に適しています.(一部のデータベースではレプリケーションがサポートされているため、可用性を確保できます.) データは、メモリ内で読み取り/書き込み可能であるため、セッションストレージに理想的です.
gradleへの依存性の追加 implementation 'org.springframework.session:spring-session-jdbc' application.属性に追加 spring.session.store-type=jdbc
1.音声ベース
同じコードを繰り返す部分->構文ベースに変更
1.1@LoginUser宣言作成
@Target(ElementType.PARAMETER) ⓐ
@Retention(RetentionPolicy.RUNTIME) ⓑ
public @interface LoginUser { ⓒ
}
1.2 LoginUserArgumentResolver
@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
private final HttpSession httpSession;
@Override
public boolean supportsParameter(MethodParameter parameter) { ⓐ
boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
return isLoginUserAnnotation && isUserClass;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { ⓑ
return httpSession.getAttribute("user");
}
}
1.3 Index Controller強化機能
@RequiredArgsConstructor
@Controller
public class IndexController {
private final PostsService postsService;
@GetMapping("/")
public String index(Model model, @LoginUser SessionUser user) { ⓐ
model.addAttribute("posts", postsService.findAllDesc());
if (user != null) {
model.addAttribute("userName", user.getName());
}
return "index";
}
}
2.セッション・リポジトリとしてデータベースを使用する
2.1セッション?
2.2マルチサーバ環境でのセッションの管理方法
(参照:https://hyuntaeknote.tistory.com/6)
2.2.1 Sticky Session
2.2.2セッションクラスタ(セッションクラスタ)
1台の
2.2.3セッションストレージ
2.3データベースをセッション・リポジトリに設定する
Reference
この問題について(改善(構文ベース&DBをセッションストレージとして使用)), 我々は、より多くの情報をここで見つけました https://velog.io/@young_209/개선-하기어노테이션-기반-세션-저장소로-DB-사용テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol