>  기사  >  Java  >  Spring 세션과 redis를 사용하여 세션을 공유하는 방법에 대한 소개

Spring 세션과 redis를 사용하여 세션을 공유하는 방법에 대한 소개

巴扎黑
巴扎黑원래의
2017-09-06 09:24:561678검색

이 글에서는 Session을 공유하기 위해 Spring, Session, Redis를 사용하는 것에 대한 관련 정보를 주로 소개합니다. 이 글에서는 샘플 코드를 통해 자세히 소개합니다. 공부나 업무에 꼭 필요한 친구들과 함께 배워보세요. 아래 편집자.

머리말

클러스터 환경을 구축한 후 고려해야 할 문제 중 하나는 사용자 액세스로 인해 생성된 세션을 어떻게 처리할지입니다.

세션을 처리하는 방법에는 여러 가지가 있습니다. 자세한 내용은 이전 블로그에 재인쇄된 클러스터/분산 환경의 5가지 세션 처리 전략을 참조하세요.

여기에서는 세 번째 방법인 세션 공유에 대해 설명합니다.

redis 클러스터는 마스터-슬레이브 복제를 수행하고 Redis 데이터베이스의 최종 일관성을 사용하여 Redis에 세션 정보를 저장합니다. 애플리케이션 서버는 세션이 로컬 메모리에 없다는 것을 발견하면 redis 데이터베이스에서 이를 검색합니다. redis 데이터베이스는 애플리케이션 서버와 독립적인 데이터베이스이므로 세션을 공유하고 가용성이 높습니다.

단점:

1. redis에는 큰 메모리가 필요합니다. 그렇지 않으면 사용자 세션이 캐시에서 지워집니다.

2. 캐시를 정기적으로 새로 고쳐야 합니다.

기본 구조는 다음과 같습니다.


하지만 이 구조에는 여전히 문제가 있습니다. 마스터가 충돌하는 경우. , Redis가 주도권을 잡지 않고 마스터 전환을 수행하며 세션 서비스가 중단됩니다.

하지만 먼저 이 구조를 구현한 다음 나중에 최적화하고 수정해 보겠습니다.

Spring Boot는 세션 공유를 완료하기 위해 Spring Session을 제공합니다.

공식 문서: http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html#boot-sample

먼저 간단한 컨트롤러 만들기:


@Controller 
public class UserController { 
 
 @RequestMapping(value="/main", method=RequestMethod.GET) 
 public String main(HttpServletRequest request) { 
 HttpSession session = request.getSession(); 
 String sessionId = (String) session.getAttribute("sessionId"); 
 if (null != sessionId) { // sessionId不为空 
 System.out.println("main sessionId:" + sessionId); 
 return "main"; 
 } else { // sessionId为空 
 return "redirect:/login"; 
 } 
 } 
 
 
 @RequestMapping(value="/login", method=RequestMethod.GET) 
 public String login() { 
 return "login"; 
 } 
 
 @RequestMapping(value="/doLogin", method=RequestMethod.POST) 
 public String doLogin(HttpServletRequest request) { 
 System.out.println("I do real login here"); 
 HttpSession session = request.getSession(); 
 String sessionId = UUID.randomUUID().toString(); 
 session.setAttribute("sessionId", sessionId); 
 System.out.println("login sessionId:" + sessionId); 
 return "redirect:/main"; 
 } 
}

간단히 말하면 권한 제어를 시뮬레이션합니다. sessionId가 있으면 홈페이지에 접속하고, 그렇지 않으면 로그인 페이지로 이동합니다.

그렇다면 어떻게 세션 공유를 달성할 수 있을까요?

다음 종속성을 추가합니다.


<!-- spring session --> 
<dependency> 
 <groupId>org.springframework.session</groupId> 
 <artifactId>spring-session</artifactId> 
 <version>1.3.0.RELEASE</version> 
</dependency> 
<!-- redis --> 
<dependency> 
 <groupId>org.springframework.boot</groupId> 
 <artifactId>spring-boot-starter-redis</artifactId> 
</dependency>

구성 클래스 추가:


@EnableRedisHttpSession 
public class HttpSessionConfig { 
 @Bean 
 public JedisConnectionFactory connectionFactory() { 
 return new JedisConnectionFactory(); 
 } 
}

이 구성 클래스의 용도는 무엇입니까?

공식 문서:

Spring 구성은 HttpSession 구현을 Spring 세션이 지원하는 구현으로 대체하는 서블릿 필터를 생성하는 역할을 담당합니다.

즉, 이 구성 클래스는 필터를 생성할 수 있습니다. 이 필터는 Spring을 지원합니다. HttpSession 대신 작동할 세션입니다.

@EnableRedisHttpSession 주석은 필터를 구현하는 springSessionRepositoryFilter라는 이름의 Spring Bean을 생성합니다. 필터는 Spring Session이 지원하는 HttpSession 구현을 대체하는 역할을 담당합니다. 이 경우 Spring Session은 Redis에 의해 지원됩니다.

@EnableRedisHttpSession 주석은 이 필터를 구현하기 위해 springSessionRepositoryFilter의 빈 객체를 생성합니다. 필터는 HttpSession을 대체하는 역할을 담당합니다.

즉, HttpSession은 더 이상 역할을 하지 않고, redis를 사용하여 필터를 통해 Session을 직접 운영하는 것입니다.

application.properties에 redis 구성 추가:


spring.redis.host=localhost 
spring.redis.password= 
spring.redis.port=6379

이렇게 하면 세션 공유가 완료됩니다. 아주 간단하지 않나요? 비즈니스 코드는 약간의 수정도 필요하지 않습니다.

확인:

처음에는 Redis 데이터베이스가 비어 있습니다.

프로젝트 실행:

페이지에 접속한 후 Redis에서 세션 정보를 볼 수 있습니다.

캐주얼 로그인 후:

메인을 입력하세요. 이는 현재 세션에 sessionId가 존재함을 의미합니다.

현재 페이지의 쿠키를 확인합니다. 즉, 이 쿠키에는 sessionId가 있습니다.


포트 8081로 새 프로젝트를 실행하세요. 원래 브라우저에서 직접 새 탭을 엽니다. 이때 쿠키가 공유된다는 것을 알고 있습니다. localhost:8081/main을 방문하세요


새 프로젝트에 성공적으로 직접 액세스했습니다! ! 동일한 쿠키를 사용하여 다른 웹 서버에서 세션을 공유할 수 있습니다.

마지막으로 다시 강조하세요:

HttpSession의 구현은 Spring Session으로 대체됩니다. HttpSession을 운영하는 것은 Redis에서 데이터를 운영하는 것과 동일합니다.

위 내용은 Spring 세션과 redis를 사용하여 세션을 공유하는 방법에 대한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.