>데이터 베이스 >Redis >분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기

분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기

coldplay.xixi
coldplay.xixi앞으로
2020-07-30 11:21:063545검색

분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기

Spring Session과 Redis를 사용하여 분산 세션 도메인 간 공유 문제 해결

현상 설명:

서비스 실행 시 프런트엔드 코드와 백엔드 코드가 분리되지 않습니다. 일반적으로 두 개의 인스턴스가 있으면 유사한 요청이 가끔 팝업됩니다. 다시 로그인하라는 메시지, 백그라운드 오류 메시지

이것은 프로세서 예외입니다. 이유는 명확하지 않습니다

머신 인스턴스를 추가한 후 프런트엔드에 액세스할 때. 페이지에서 로그인 페이지에 반복적으로 액세스하여 302페이지가 발생했습니다. 다양한 표시가 로그인 구성 문제로 인해 발생했음을 나타냅니다.

관련 주제 추천: php 세션 (사진, 텍스트, 동영상, 사례 포함)

문제 소개: 세션을 공유할 수 없어 로그인이 필요한 서로 다른 시스템 간에 폴링이 발생하여 최종 서비스 예외가 발생함

솔루션: Spring Session 및 Redis를 사용하여 분산 세션 도메인 간 공유 문제를 해결합니다.

구성 해결:

1 )종속성 추가

<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
  <version>1.2.0.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.apache.velocity</groupId>
  <artifactId>velocity</artifactId>
  <version>1.7</version>
</dependency>

2 ) web.xml 구성 파일 추가:

<!-- 分布式Session共享Filter -->
<filter>
  <filter-name>springSessionRepositoryFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>springSessionRepositoryFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

3 ) Spring.xml 구성

<!-- 将session放入redis -->
<context:annotation-config/>
<bean id="redisHttpSessionConfiguration"   class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
   <property name="maxInactiveIntervalInSeconds" value="120" />
</bean>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
   <!-- redis 配置 -->
   <property name="hostName" value="192.168.0.48" />
   <property name="port" value="6379" />
</bean>

분석:

1. 웹의 DelegatingFilterProxy 클래스: 이는 봄에 Tomcat이 로드되기 시작할 때 필터 관리를 Bean에 넘겨줍니다. 또한 세 번째 단계의 구성에서는 RedisHttpSessionConfiguration

2을 소개합니다. RedisHttpSessionConfiguration은 SpringHttpSessionConfiguration 클래스를 상속합니다. SpringHttpSessionConfiguration은 @Bean을 통해 springSessionRepositoryFilter를 주입합니다.

3 、SessionRepositoryFilter 이 필터는 DelegatingFilterProxy가 이전에 검색한 필터입니다. SessionRepositoryFilter가 핵심입니다.

init-param 매개변수가 지정되지 않은 경우 DelegatingFilterProxy는 필터 이름을 사용합니다. 검색할 Bean 객체는 DelegatingFilterProxy 클래스의 역할이기도 합니다. 모든 요청이 이 필터를 통과하고 이 필터를 통과하는 요청도 springSessionRepositoryFilter 필터를 통과하는 것을 볼 수 있으므로 springSessionRepositoryFilter 필터를 살펴보겠습니다.

4, SessionRepositoryFilter의 기능은 컨테이너의 기본 javax.servlet.http.HttpSession 지원을 org.springframework.session.Session으로 대체하는 것입니다.

SessionRepositoryFilter의 주요 메소드와 속성은 다음과 같습니다: SessionRepositoryFilter这个过滤器就是前边DelegatingFilterProxy查找的过滤器SessionRepositoryFilter是关键,具体怎么关联起来的呢?

如果未指定init-param参数的话,DelegatingFilterProxy就会把filter-name作为要查找的Bean对象,这也是DelegatingFilterProxy类的作用。可以看出每一个请求都会经过该filter,经过该filter的请求也会相应的经过springSessionRepositoryFilter这个过滤器,那么我们就接着看一下springSessionRepositoryFilter这个过滤器 

4、SessionRepositoryFilter的作用就是替换容器默认的javax.servlet.http.HttpSession支持为org.springframework.session.Session

SessionRepositoryFilter的主要方法和属性如下: 

분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기

5、其中SessionRepositoryResponseWrapperSessionRepositoryRequestWrapperHttpSessionWrapper

분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기

분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기5. 그 중 SessionRepositoryResponseWrapper, SessionRepositoryRequestWrapper, HttpSessionWrapper는 내부 클래스이며, 이는 또한 매우 중요합니다. 예를 들어, SessionRepositoryRequestWrapper Class는 SessionRepositoryRequestWrapper가 javax.servlet.http.httpservletrequestWrapper 클래스를 상속한다는 것을 알 수 있습니다. SessionRepositoryRequestWrapper는 HttpServletRequestWrapper를 상속하고, HttpServletRequestWrapper는 HttpServletRequest 인터페이스를 구현하며, SessionRepositoryRequestWrapper는 HttpServletRequest 인터페이스의 일부 메소드를 다시 작성하므로 getSession 및changeSessionId와 같은 메소드가 있습니다. 이 시점에서 우리는 원래 요청과 응답이 다시 패키징되었다는 것을 대략적으로 이해해야 합니다. 우리는 또한 원래 HttpSesion이 어떻게 Spring Session으로 대체되었는지 이해합니다.

분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기

단축키를 사용하여 request.getSession()의 특정 구현을 확인하면 SessionRepositoryRequestWrapper에 의해 재정의된 메서드가 이미 있음을 알 수 있습니다. 위에는 두 가지 기본 구현이 있는데, 하나는 원본이고 다른 하나는 Spring Session에 의해 구현됩니다. 어느 것을 구현으로 선택해야 합니까? 이것은 위에서 언급한 DelegatingFilterProxy 프록시의 역할입니다. 각 요청은 DelegatingFilterProxy를 통해 필터링됩니다. 또한 springSessionRepositoryFilter 필터를 통해 springSessionRepositoryFilter 필터는 원래 요청을 SessionRepositoryRequestWrapper로 변환하는 것을 실현합니다.

request.getSession().setAttribute(name, value)구현: 코드를 추적하면 아래 콘텐츠에 도달할 수 있습니다.

분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기Redis 관련 작업을 볼 수 있습니다! 이 시점에서 우리는 Spring Session이 어떻게 작동하는지 알아야 합니다! 아래 과정은 다시 소개하지는 않지만 이미 명확하게 이해되어 있습니다.

관련 학습 권장 사항: redis 비디오 튜토리얼

위 내용은 분산 세션 도메인 간 공유 문제를 해결하기 위해 Spring 세션 및 Redis 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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