ホームページ >Java >&#&チュートリアル >SpringBoot2.x バージョンで SpringSession を使用して一般的な問題を解決する方法

SpringBoot2.x バージョンで SpringSession を使用して一般的な問題を解決する方法

王林
王林転載
2023-05-17 14:34:461138ブラウズ

SpringBoot2.x SpringSession Traps

コンテキストの初期化中に例外が発生しました - 更新の試行をキャンセルしています: org.springframework.beans.factory.BeanCreationException: 'org.springframework.boot.autoconfigure という名前の Bean の作成中にエラーが発生しました。 .session.SessionAutoConfiguration$ServletSessionRepositoryValidator': init メソッドの呼び出しに失敗しました。ネストされた例外は org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException: セッション リポジトリを自動構成できませんでした。構成を確認してください (セッション ストア タイプは 'redis' です)

これは、spring-session-data-redis 依存関係が欠落しているためです。

SpringBoot2 について Spring-session-core を使用すると、spring-session-data-redis が読み込まれないため、ユーザーは spring-session と redis の間に依存関係を追加する必要があります。

Springboot 2.x の罠 - クロスドメインがセッションの問題を引き起こす

現在、IT 業界ではフロントエンドとバックエンドを分離するのが主流ですが、今後は必ず分離することになります。分離プロセス中のクロスドメインの問題。

クロスドメインとは何ですか?

は、ブラウザがあるドメイン名の Web ページから別のドメイン名にリソースを要求するときに、ドメイン名、ポート、またはプロトコルが異なる場合、それはクロスドメインであることを意味します。

遭遇したシナリオ

バックグラウンド管理プロジェクトに springboot shrio vue を使用すると、hiroSession の現在ログインしているユーザーを取得できません。

そこで確認したところ、オンラインです。ドメインをまたぐときにセッションを通過させるだけで十分だと言いました

バックエンド

 <!--SpringSession依赖-->
 <dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-core</artifactId>
 </dependency>
 <!--SpringSessionRedis依赖-->
 <dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
 </dependency>

フロントエンド

#使用使用Redis缓存session数据
spring.session.store-type=REDIS
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器端口号
spring.redis.port=6379

しかし、それでもNoに設定した後も同じです。Baidu とトラブルシューティングを 1 日行った後、springboot 1.x にロールバックしましたが、そのような問題は発生しませんでした。そのため、原因は springboot 2 へのアップグレードによって引き起こされていることがわかりました。 .x. さて、殺人者を捕まえました。適切な薬を服用できるようになりました。オンラインで springboot の 2.x スプリング セッションへのアップグレードに関連する問題について読みました。

ついに新しい世界を発見しました。Spring-session 2.x では、実際に SameSite が Cookie に導入されました。デフォルト値は Lax です。わかりました。これが何であるかを見てみましょう。

SameSite Cookie は CSRF 攻撃を防ぐために使用されます。値は 2 つあります: Strict と Lax

SameSite = Strict:

は厳密モードを意味し、この Cookie はいかなる状況でもサードパーティ Cookie として使用できないことを示します。

SameSite = Lax:

はリラックス モードを意味し、最初のモードとして使用できます。 GET リクエスト サードパーティの Cookie ですが、クロスドメインのポスト アクセス用の Cookie を運ぶことはできません (これは非常に面倒です。検証インターフェイスは POST リクエストです) 概要: フロントエンドからバックエンドへのリクエスト、およびそれぞれのセッションが異なります。毎回新しいセッションになるため、ユーザー情報は取得されません

解決策:

SameSite を空に設定します

@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        // 允许任何域名使用
        corsConfiguration.addAllowedOrigin("*");
        // 允许任何头
        corsConfiguration.addAllowedHeader("*");
        // 允许任何方法(post、get等)
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setMaxAge(3600L);
        return corsConfiguration;
    }
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对接口配置跨域设置
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}

以上がSpringBoot2.x バージョンで SpringSession を使用して一般的な問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。