스프링 세션 적용하기 with 필터 !
🔍 Session 정보 이용하기
✏️ 1. 컨트롤러에서 HttpSession 클래스 이용하기
HttpSession 클래스를 파라미터로 받으면 session 정보를 사용할 수 있다.
✏️ 2. 필터 또는 인터셉터 이용하기
필자는 세션 정보를 거의 모든 요청 API에서 확인해야 한다. 따라서 Controller에서 session 정보를 불러오는 중복을 해결하기 위해 필터를 이용하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component
class SessionFilter(
): OncePerRequestFilter() {
val log = logger()
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
filterChain: FilterChain
) {
val session = getSessionFromCookie(request) --- 1
if (session == null) {
val sessionId = request.getSession(true).id --- 2
}
filterChain.doFilter(request, response)
}
}
- 쿠키에 세션에 대한 정보가 있는지 확인한다.
- 세션이 없다면 새로운 세션을 생성한다. (세션이 생성될 때 저장소에 저장된다)
- 이때, 스프링 세션을 사용하면 스프링 세션으로 저장한 저장소에 자동으로 저장된다.
redisSessionRepository.save(session)
와 같은 작업을 할 필요가 없다.
MyRedisSessionRepository는 다음처럼 되어 있다.
1
2
3
4
5
6
7
8
9
10
class MyRedisSessionRepository(
...
) {
private val SESSION_PREFIX = "kmall:sessions:"
fun setSession(sessionId: String) {
stringRedisTemplate.opsForSet().add(SESSION_PREFIX, sessionId)
stringRedisTemplate.expire(SESSION_PREFIX, 3, TimeUnit.DAYS)
}
}
- SESSION_PREFIX는 세션을 저장할 때 사용할 prefix이다.
- setSession 메서드는 세션을 저장소에 저장한다.
🔍 결론
- HttpSession은 메서드의 파라미터로 받아서 간단하게 이용할 수 있었다.
- Spring Session을 사용하면 세션을 생성할 때 자동으로 저장소에 저장한다.
- 필터를 사용하여 컨트롤러에 생기는 중복 코드를 제 거할 수 있다.
🗝️ 트러블 슈팅
This post is licensed under CC BY 4.0 by the author.