>  기사  >  Java  >  SpringBoot2.x 버전에서 SpringSession을 사용하여 일반적인 문제를 해결하는 방법

SpringBoot2.x 버전에서 SpringSession을 사용하여 일반적인 문제를 해결하는 방법

王林
王林앞으로
2023-05-17 14:34:461080검색

SpringBoot2.x SpringSession 함정

컨텍스트 초기화 중 예외 발생 - 새로 고침 시도 취소 중: org.springframework.beans.factory.BeanCreationException: 이름이 'org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$ServletSessionRepositoryValidator'인 Bean 생성 중 오류 발생: init 메소드 호출 실패; 중첩된 예외는 org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException입니다. 세션 저장소를 자동으로 구성할 수 없습니다. 구성을 확인하십시오(세션 저장소 유형은 'redis'입니다)

이것은 누락 때문입니다. Spring-session-data-redis 종속성.

SpringBoot2에 대해 -data-redis가 로드되고 사용자는 spring-session과 redis 사이에 종속성을 추가해야 합니다.

Springboot 2.x의 함정 - 크로스 도메인으로 인해 세션 문제가 발생함

현재 IT업계에서는 프론트엔드와 백엔드를 분리하는 것이 주류이지만, 분리 과정에서 크로스 도메인 문제가 발생할 것은 분명합니다. .

교차 도메인이란 무엇인가요?

는 브라우저가 한 도메인 이름의 웹페이지에서 다른 도메인 이름으로 리소스를 요청할 때 도메인 이름, 포트 또는 프로토콜이 다른 경우 교차 도메인임을 의미합니다.

발생한 시나리오

springboot + shrio +vue를 사용하여 백그라운드 관리 프로젝트를 수행할 때 현재 로그인된 shiroSession 사용자를 가져올 수 없습니다.

그래서 확인해 보니 온라인에서는 그냥 세션을 허용할 수 있다고 합니다. 도메인을 교차할 때 통과

Backend

 <!--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>

Frontend

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

하지만 설정한 후에도 여전히 작동하지 않습니다 하루 동안 Baidu를 사용하고 문제를 해결한 후 springboot 1.x로 롤백했는데 거기에 있었습니다. 그런 문제가 없어서 springboot로 업그레이드하기로 했습니다. 2.x의 원인은 뭐, 살인자가 잡혔으니 이제 맞는 약을 처방할 수 있게 되었습니다. springboot 2.x로 업그레이드하는 것과 관련된 이슈를 읽기 위해 온라인에 접속했습니다. 세션.

드디어 새로운 세계를 발견했습니다. Spring 세션 2.x에서는 실제로 SameSite가 Cookie에 도입되었습니다. 자, 이것이 무엇인지 살펴보겠습니다.

SameSite 쿠키는 CSRF 공격을 방지하는 데 사용됩니다. Strict, Lax

SameSite = Strict:

는 엄격 모드를 의미하며 어떤 상황에서도 이 쿠키가 불가능함을 나타냅니다. 타사 쿠키

SameSite = Lax:SameSite = Strict:

意为严格模式,表明这个cookie在任何情况下都不可能作为第三方cookie;

SameSite = Lax:

는 완화 모드를 의미합니다. GET 요청에서 타사 쿠키로 사용할 수 있지만 도메인 간 게시물 액세스를 위해 쿠키를 전달할 수는 없습니다. 매우 고통스럽습니다. 예, 우리의 확인 인터페이스는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제