본문 바로가기

Java/JavaSpring

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인 상태에서 지정한 이름을 가진 쿠키가 존재하지 않으면 익셉션이 발생한다.