ログイン インターセプターがセッションから情報を取得できない (セッション無効化の問題)

プロジェクト環境:SpringBoot + Vue

セッション無効化の問題

問題の説明

または、「セッションの不一致の問題」と呼ばれます。

ログイン インターセプター。ログインに成功した後、情報はセッションに保存されますが、インターセプターはセッションから情報を取得できません。

ユーザーが次のように正しいユーザー名とパスワードを入力すると、ここに画像の説明を挿入

「ログイン」をクリックすると、次のようにログインが成功したことを示すメッセージが表示されます。

ここに画像の説明を挿入

[OK] をクリックした後、MainCrud にジャンプするのが適切ですが、次のように再度ログインするように指示されます。

ここに画像の説明を挿入

そこで問題を探しに行きました。問題はログイン インターセプターにありました。セッション関連。

コードフローを分析する

[OK] をクリックした後、フロント エンドは vue-router を介して MyCRUD.vue ページに直接ジャンプします。このページはロード時に user/getList リクエストを呼び出します。バックエンドのログイン インターセプタでそれを構成しており、このリクエストは次のように、ログイン デバイスのインターセプトによってインターセプトされます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-hHkI5yGa-1659591271060)(img/image-20220804104413285.png)]

したがって、次のように、loginIntercepter に入り、インターセプター内でセッションに進み、この情報が存在するかどうかを判断します。

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-itA5q1Pt-1659591271060)(img/image-20220804104633577.png)]

存在するなら放っておいてください。

出力を表示します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ahFjwXC6-1659591271061)(img/image-20220804103938375.png)]

問題は上記の通りで、ログイン時のセッションとインターセプター内のセッションが全く同じではないことが判明し、対応する情報が格納されておらず、インターセプター内の要件を満たせなくなってしまいます。

理由

セッションに関連する原則:

セッションを生成するために初めて HttpServletRequest.getSession (true) を呼び出すと、sessionId が生成され、クライアントに返されて cookie に保存されます。再度リクエストすると、sessionId は、セッション ID とともにサーバーに送信されます。 Cookie を取得すると、サーバーは sessionId セッションに従ってそれを取得します。

初めてサーバーにアクセスすると、次のように、JsessionID を含む Set-Cookie 情報が応答ヘッダーに表示されます (この情報は、初めてサーバーにアクセスするときにのみ応答ヘッダーに表示されます)。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-YXuk8btB-1659591271062)(img/image-20220804111824609.png)]

次回サーバーへの他のリクエストにアクセスすると、リクエスト ヘッダーの Cookie にセッション ID が含まれるため、サーバーはセッションを取得できます。

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-QfSmOHJw-1659591271062)(img/image-20220804112013139.png)]

概要: セッションはサーバー側に常に存在するわけではなく、Cookie に依存するため、対話時に Cookie の受信を許可する必要があります。

解決

エラーが報告される理由は、Vue のフロントエンドとバックエンドの分離プロジェクトにおいて、クロスドメインの問題を解決する必要があるためです。クロスドメインの場合、Cookie の受信を許可する設定を行っていないため、フロントエンドとバックエンドで個別に設定できます。次のように

フロントエンドのmain.jsで設定する

axios.defaults.withCredentials = true//设置发送请求时运行携带cookie信息

バックエンドの WebMvcConfig の addCorsMappings メソッドで構成されます。

.allowCredentials(true) //设置是否允许客户端发送cookie信息。默认是false

参考:

セッション原則

セッションの失敗

セッション無効化の問題 (注釈フォーム)

ドメイン間でのセッションの移植

おすすめ

転載: blog.csdn.net/Supreme7/article/details/126157826