Chap 13. MVC 3: 세션, 인터셉터, 쿠키
컨트롤러에서 HttpSession 사용하기
컨트롤러에서 HttpSession을 사용하려면 다음 방법중 하나를 사용한다.
- 요청 매핑 애노테이션 적용 매서드에 HttpSession 파라미터 추가
- 요청 매핑 애노테이션 적용 매서드에 HttpServletRequest 파라미터 추가 HttpServlet Request를 이용해서 HttpSession을 구한다.
Life Cycle 길이 : request < model < session
요청 매핑 애노테이션(@Request) 적용 메서드에 HttpSession 파라미터가 존재할 경우 스프링 MVC는 컨트롤러의 메서드를 호출할 때 HttpSession 객체를 파라미터로 전달한다.
HttpSession을 생성하기 전이면 새로운 HttpSession을 생성, 그렇지 않으면 기존에 존재하는 HttpSession을 전달한다.
인터셉터 사용하기
로그인 하지 않은상태는 세션이 존재 하지 않는 상태이다. 이때는 비밀번호 변경 등 로그인이 필수적인 항목에서 수행되어야 될 페이지로 접근하면 안된다.
다수의 컨트롤러에 대해 동일한 기능을 적용해야 할 때 사용할 수 있는 것이 HandlerInterceptor이다.
org.springframework.web.HandlerInterceptor 인터페이스 사용 시 세 지점에 공통기능을 넣을 수 있다.
- 컨트롤러(핸들러) 실행 전
- 컨트롤러(핸들러) 실행 후, 아직 뷰를 실행하기 전
- 뷰를 실행한 이후
세 시점을 처리하기 위해 HandlerInterceptor 인터페이스는 다음 메서드를 정의하고 있다.
boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception;
void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception;
preHandle() 메서드는 컨트롤러(핸들러) 객체를 실행하기 전에 필요한 기능을 구현한다. 메서드 리턴 타입은 boolean이다. false를 리턴하면 컨트롤러를 실행하지 않는다.
- 로그인하지 않은 경우(세션이 없는경우) 컨트롤러를 실행하지 않음
- 컨트롤러를 실행하기 전에 컨트롤러에서 필요로 하는 정보 생성
postHandle() 메서드는 컨트롤러 실행 이후 추가기능을 구현할때 사용한다.
afterCompletion() 메서드는 뷰가 클라이언트에 응답을 전송한 뒤에 실행한다. 후처리를 하기 적합한 메서드이다.
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession(false);
if (session != null) {
Object authInfo = session.getAttribute("authInfo");// authInfo 속성 존재 시 true
if (authInfo != null) {
return true;
}
}
response.sendRedirect(request.getContextPath() + "/login");// 현재 컨텍스트 경로 리턴
return false;
}
컨트롤러에서 쿠키 사용하기
쿠키는 클라이언트에서 정보를 저장하는 것이다. 이와 반대로 세션은 서버에 정보를 저장하는 것이다. 하지만 둘의 역할은 같다.
다음과 예제와 같이 쿠키를 사용할 수 있다. 이메일 기억하기 기능을 구현한다.
- 로그인 폼에 "이메일 기억하기" 옵션추가
- 로그인 성공 후 쿠키에 이메일 저장. 유효시간을 길게 설정
- 쿠키 존재 시 입력 폼에 이메일을 넣어준다.
스프링MVC에서 쿠키를 사용하는 방법중 하나는 @CookieValue 애노테이션을 사용하는것이다.
@GetMapping
public String form(LoginCommand loginCommand,
@CookieValue(value = "REMEMBER", required = false) Cookie rCookie) {
if (rCookie != null) {
loginCommand.setEmail(rCookie.getValue());
loginCommand.setRememberEmail(true);
}
return "login/loginForm";
}
이메일 기억하기를 선택하지 않을 수도 있어서 required 속성을 false로 하였다. required의 기본 속성은 true 이다. required가 true인 상태에서 지정한 이름을 가진 쿠키가 존재하지 않으면 익셉션이 발생한다.