自分のプロジェクトのログイン登録ページを作成するとき、登録およびパスワード変更機能は電子メール検証を使用するため、バックエンドは検証コードを送信するときに応答データに Cookie を追加します
Cookie cookie = new Cookie(toEmail.split("@")[0],verCode); cookie.setMaxAge(30*60); response.addCookie(cookie);
その後、クリックしてパスワードを登録または変更すると、バックエンドはリクエストから Cookie を取得して電子メールと確認コード情報を取得します
Cookie[] cookies = request.getCookies();
ローカルでテストする場合、Cookie は応答に正しく追加でき、また、正しく取得できました
しかし、プロジェクトをクラウドにパッケージ化してから ajax アクセスを実行すると、問題が発生しました。Cookie の取得に失敗しました!
レスポンス ヘッダーには set-Cookie が明確にありますが、2 番目のリクエスト ヘッダーには Cookie が見つかりません。
サーバーは Cookie の取得に失敗し、エラーを報告します。Cookie を使用して、パスワードの登録と変更が無効です。ドキュメントを検索したところ、エラーの原因は Springboot と Ajax のクロスドメイン Cookie 損失の問題であることがわかりました。バックエンドは初めてなので、
私は自分の投稿のみを投稿します解決策はこちらです
1. Ajax リクエストは xmlhttp.withCredentials = true; #3. コントローラーの API で応答の応答ヘッダーを設定します。 キー
は「Access-Control-Allow-Origin」アクセス制御許可ソース、http リクエストヘッダー情報、許可リソース共有の設定 (クロスドメイン) ソースvar xmlhttp = new XMLHttpRequest(); xmlhttp.withCredentials = true; xmlhttp.open("GET", readyUrl, true); xmlhttp.send();
value は request.getHeader(" Origin") を表します。 プロトコルとドメイン名
ページの組み合わせ 現在リクエストされているリソースが存在する場所 これらは一緒に意味します 現在リクエストされているリソースのバックエンドへのアクセスを許可しますドメイン間のリソース
これら 3 つの部分を設定した後、Cookie を再度取得できます2022 年 12 月 9 日更新:
見つかりましたクロスドメイン リクエスト フィルターを追加するためのより簡潔で便利な方法Druid データ プール依存関係パッケージの StringUtils.isEmpty メソッドを使用しました。エラーが報告された場合は、自分で置き換えを記述するだけです
package com.crisp.myblog.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class corsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //是否发送Cookie .allowCredentials(true) //放行哪些原始域 .allowedOriginPatterns("这里填你前端代码所在的域名:端口") .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) .allowedHeaders("*") .exposedHeaders("*"); } }
以上がSpringBoot での Ajax クロスドメインと Cookie の失敗の問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。