레디 스 해결 세션 기반의 분산 일관성

1.session는 무엇인가

사용자가 프론트 엔드에서 요청을 시작하면, 서버는 현재 세션에 대한 사용자를 생성합니다, 서버가 sessionId가 클라이언트로 다시 쓴 것, 한 사용자가 브라우저를 종료하지 않는 한, 서버 요청을 다시 sessionId가이 서버에 전달

서버는 sessionId가에 따라 그들의 서비스에 해당하는 세션을 찾습니다.

 분산 배치 시간에, 세션, 서버 측에서 사용자 요청을 통해,로드 밸런싱, 다른 서버 노드에 배포 될 수있다 다음 번에 저장되어 있으므로, 필요 일관성 세션의 문제를 해결하기 위해,

분산 세션을 구현하는 레디 스 사용은 개인의 이해가, 시간이 각 요청에 대해 온 레디 스 세션에 저장되어, 레디 스에서 세션 정보를 읽고

 

2. 코드 구현

 의존 도입 할 필요가 ①.maven

  

<의존성> 
    <의 groupId> org.springframework.boot </의 groupId> 
    <artifactId를> 스프링 부팅 스타터 웹 </ artifactId를> 
</ 의존성> 
<의존성> 
    <의 groupId> org.springframework.session </의 groupId> 
    <artifactId를 > 스프링 세션 </ artifactId를> 
</ 의존성>

②. 레디 스 구성 파일은 IP 및 포트를 지정합니다

spring.redis.host = 172.18.66.45 
spring.redis.port = 6,379

 

③.httpSession 구성

패키지 com.session.config; 

수입 org.springframework.beans.factory.annotation.Value;
수입 org.springframework.context.annotation.Bean;
수입 org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
수입 org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
// maxInactiveIntervalInSeconds设置세션有效时间,单位是秒,默认是30分钟 
@EnableRedisHttpSession (maxInactiveIntervalInSeconds = 180 )
 공공  클래스 SessionConfig { 
    
    @Value ( "$ {spring.redis.host}" )
     개인 문자열 호스트 이름; 
    @값("$ {spring.redis.port}" )
     개인  INT의 포트; 

    @Bean 
    공개 JedisConnectionFactory ConnectionFactory에 () { 
        JedisConnectionFactory ConnectionFactory를 = 새로운 JedisConnectionFactory (); 
        connectionFactory.setPort (포트); 
        connectionFactory.setHostName 이름 (hostname); 
        에서 System.out.println ( "获取到的호스트 이름是:"+ 여기서 hostName + ", 포트 :"+ 포트);
        반환 ConnectionFactory를을; 
    } 
}

 

그리고 컨트롤러를 구현, 당신은 실제 비즈니스 시나리오에 따라 세션을 작성 시뮬레이션 할 수 있습니다 로그인 세션 체크 사용자 여부

패키지 com.session.controller; 

수입 나오는 javax.servlet.http.HttpServletRequest;
수입 javax.servlet.http.HttpSession; 

수입 org.springframework.web.bind.annotation.RequestMapping;
수입 org.springframework.web.bind.annotation.RestController; 

@RestController 
공공  클래스 SessionController { 

    // 模拟第一次登陆时,保存세션 
    @RequestMapping (값 = "/ 로그인" )
     공공 문자열 로그인 (HttpServletRequest의 요청) { 
        의 HttpSession 세션 = request.getSession (); 
        문자열 str을 = (문자열) session.getAttribute ( "사용자 정보" );
        IF (STR == null이 || "" .equals이 (STR)가) { 
            session.setAttribute는 ( "사용자 정보", "세션 MPY 테스트" );
             반환 성공적으로 로그인 -SUCCESS을 "" ; 
        } 다른 사람이 {
             반환 "세션 데이터가 존재 사용자가 "로그온 ; 
        } 
    } 

    / * 상기 방법은, 모드 랜딩 콜 서비스 인터페이스 
실제 비즈니스 시나리오에서 *는 인터셉터는 각 요청에 대해 사용할 수있는 사용자의 로그인 인증을, 세션이 만료되었는지 여부를 판정한다
* / @RequestMapping (값 = "/를하는 getSession" ) 공중 문자열하는 getSession (HttpServletRequest의 요청) { 의 HttpSession 세션 = Request.getSession (); STR 문자열 = (문자열) session.getAttribute ( "사용자 정보" ); IF (STR == null이 || "," {.equals (STR))는 반환하지 세션, 기호 "에 데이터를" ; } 그렇지 않으면 { // 로그인 사용자가 다른 서비스 코드의 처리 에서 System.out.println ( "세션 속성은"+ STR) 반환 STR 단계; } } @RequestMapping (값 = "/ 짐바브웨 아웃" ) 공중 문자열 짐바브웨 아웃 (HttpServletRequest의 요청) { 의 HttpSession 세션 = Request.getSession (); 문자열 str을= (문자열) session.getAttribute ( "사용자 정보" ); 경우 (STR =! && "" .equals (STR)) { session.invalidate (); } 반환 "退出成功" ; } }

 

 원리 @EnableRedisHttpSession과 학습의 봄 세션은 공부 될

특정 코드는 GitHub의에 업로드되어, HTTPS : //github.com/mapy95/spring-session.git

추천

출처www.cnblogs.com/mpyn/p/11069179.html