プロジェクト環境:SpringBoot + Vue
セッション無効化の問題
問題の説明
または、「セッションの不一致の問題」と呼ばれます。
ログイン インターセプター。ログインに成功した後、情報はセッションに保存されますが、インターセプターはセッションから情報を取得できません。
ユーザーが次のように正しいユーザー名とパスワードを入力すると、
「ログイン」をクリックすると、次のようにログインが成功したことを示すメッセージが表示されます。
[OK] をクリックした後、MainCrud にジャンプするのが適切ですが、次のように再度ログインするように指示されます。
そこで問題を探しに行きました。問題はログイン インターセプターにありました。セッション関連。
コードフローを分析する
[OK] をクリックした後、フロント エンドは vue-router を介して MyCRUD.vue ページに直接ジャンプします。このページはロード時に user/getList リクエストを呼び出します。バックエンドのログイン インターセプタでそれを構成しており、このリクエストは次のように、ログイン デバイスのインターセプトによってインターセプトされます。
したがって、次のように、loginIntercepter に入り、インターセプター内でセッションに進み、この情報が存在するかどうかを判断します。
存在するなら放っておいてください。
出力を表示します。
問題は上記の通りで、ログイン時のセッションとインターセプター内のセッションが全く同じではないことが判明し、対応する情報が格納されておらず、インターセプター内の要件を満たせなくなってしまいます。
理由
セッションに関連する原則:
セッションを生成するために初めて HttpServletRequest.getSession (true) を呼び出すと、sessionId が生成され、クライアントに返されて cookie に保存されます。再度リクエストすると、sessionId は、セッション ID とともにサーバーに送信されます。 Cookie を取得すると、サーバーは sessionId セッションに従ってそれを取得します。
初めてサーバーにアクセスすると、次のように、JsessionID を含む Set-Cookie 情報が応答ヘッダーに表示されます (この情報は、初めてサーバーにアクセスするときにのみ応答ヘッダーに表示されます)。
次回サーバーへの他のリクエストにアクセスすると、リクエスト ヘッダーの Cookie にセッション ID が含まれるため、サーバーはセッションを取得できます。
概要: セッションはサーバー側に常に存在するわけではなく、Cookie に依存するため、対話時に Cookie の受信を許可する必要があります。
解決
エラーが報告される理由は、Vue のフロントエンドとバックエンドの分離プロジェクトにおいて、クロスドメインの問題を解決する必要があるためです。クロスドメインの場合、Cookie の受信を許可する設定を行っていないため、フロントエンドとバックエンドで個別に設定できます。次のように
フロントエンドのmain.jsで設定する
axios.defaults.withCredentials = true//设置发送请求时运行携带cookie信息
バックエンドの WebMvcConfig の addCorsMappings メソッドで構成されます。
.allowCredentials(true) //设置是否允许客户端发送cookie信息。默认是false
参考: