@GetMapping("/")
public String homeLoginV3Spring(
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) {
//세션에 회원 데이터가 없으면 homeif (loginMember == null) {
return"home";
}
//세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return"loginHome";
}
Tracking session
쿠키를 지원하는지 안하는지 서버는 모른다. 그래서 주소에 JSESSIONID를 세션 생성할때 내려 보내는데 이것을 모든 컨트롤러에서 다 파싱을 해야하니 불편하다.
대게는 쿠키지원을 하니까 tracking-modes를 cookie로 변경하면 주소에 JSESSIONID가 사라진다.
yaml
server.servlet.session.tracking-modes=cookie
Session timeout
yaml
server.servlet.session.timeout=30m
Filter, Interceptor
Filter : 서블릿
Interceptor : 스프링
Filter
만약 로그인 여부 체크를 컨트롤러마다 해야 한다면 번거롭다. 그래서 공통 관심사를 처리하는 AOP를 활용할 수도 있지만, 예를들어 특정URL에 대한 처리와 같은 웹과 관련된 부가기능이 함께 있는 서블릿 필터, 스프링 인터셉터를 활용하는것이 좋다.
사용방법은 servlet.Filter를 구현해 doFilter에 적절한 로직을 넣고 (chain.doFilter 필수)
spring.WebMvcConfigurer를 구현, (@Configuration) FilterRegistrationBean를 사용해 필터를 등록하면 된다.
Interceptor
스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다.
서블릿의 필터랑 다르게 URL패턴이 더 정밀하다. addPathPatterns, excludePathPatterns
사용방법은 HandlerInterceptor를 구현해 preHandler를 구현한다.
그리고 필터와 마찬가지로 WebMvcConfigurer에 InterceptorRegistry로 등록한다
ArgumentResolver
@SessionAttribute의 긴 어노테이션 대신 임의로 어노테이션을 만들어 Request Mappling Handler Adaptor 구조를 접목할 수 있다.