computer_study

[Spring] 13. MVC3 : 세션, 인터셉터, 쿠키 본문

스터디/스프링5 프로그래밍 입문

[Spring] 13. MVC3 : 세션, 인터셉터, 쿠키

knowable 2022. 5. 16. 11:13

1. 프로젝트 준비

2. 로그임 처리를 위한 코드 준비

 

3. 컨트롤러에서 HttpSession 사용하기

로그인 상태를 유지하기 위해 HttpSession을 이용하거나 쿠키를 이용할 수 있다.

HttpSession 사용 방법

  • 요청 매핑 애노테이션 적용 메서드에 HttpSession 파라미터를 추가한다.(항상 HttpSession을 생성)
@PostMapping
public String form(LoginCommand loginCommand, Errors errors, HttpSession session){
   // 세션 사용 코드
}
  • 요청 매핑 애노테이션 적용 메서드에 HttpServletRequest 파라미터를 추가하고 HttpServletRequest를 이용해서 HttpSession을 구한다 (필요 시점에만 HttpSession 생성 가능)
@PostMapping
public String submit(
      LoginCommand loginCommand.Errors errors, HttpServletRequest req){
    HttpSession session = req.getSession();
  // 세션 사용 코드
}

로그아웃 시에는 HttpSession을 제거하도록 한다.

 

4. 비밀번호 변경 기능 구현

  • ChangePwdCommand
    • 현재 비밀번호와 새 비밀번호 파라미터를 입력받로고 하는 클래스
  • ChangePwdCommandValidator
  • ChangePwdController
  • changePwdForm.jsp
  • changedPwd.jsp
  • label.properties에 메시지 추가
  • ControllerConfig 설정 클래스에 빈 설정 추가

5. 인터셉터 사용하기

다수의 컨트롤러에 대해 동일한 기능을 적용해야 할 때 사용할 수 있다. (ex. 로그인 여부 확인)

HandlerInterceptor 인터페이스는 세 시점을 처리할 수 있다

  • preHandle(컨트롤러 실행 전)
    • example
      • 로그인 하지 않은 경우 컨트롤러를 실행하지않도록
      • 컨트롤러 실행 전 컨트롤러에서 필요로 하는 정보 생성
  • postHandle(컨트롤러 실행 후, 뷰 실행 전)
    • 컨트롤러가 정상적으로 실행된 이후에 추가 기능을 구현할 때 사용
    • 컨트롤러가 익셉션을 발생하면 postHandle메서드는 실행되지 않는다.
  • afterCompletion(뷰 실행 후)
    • 뷰가 클라이언트에 응답을 전송한 뒤에 실행
    • 컨트롤러에서 익셉션이 발생하면 네 번째 파라미터에 전달, 발생 안하면 null로 전달

public void addInterceptors(InterceptorRegistry registry){
    registry.addInterceptor(authCheckInterceptor())
        .addPathPatterns("/edit/**");// 제외하고싶다면 excludePathPatterns 사용
        // *  : 0개 또는 그 이상의 글자
        // ?  : 1개 글자
        // ** : 0개 또는 그 이상의 폴더 경로
        // 여러개면 콤마로 구분
}
  • example
    • /edit/changePassword경로에 AuthCheckInterceptor가 적용된다.
    • 로그인 하지 않은 상태에서 /edit/changePassword경로에 접근 시 로그인 폼으로 리다이렉트 가능

6. 컽트롤러에서 쿠키 사용하기

@CookieValue 애노테이션을 사용

@GepMapping
public String form(LoginCommand loginCommand,
// value로 쿠키 이름 정하기, 이 쿠키가 존재하지 않을 수도 있다면 required가 false(default는 true)
      @CookieValue(value="REMEBER", required = false) Cookie rCookie){
    if(rCookie!=null){ // 쿠키 존재 시 쿠키로 로그인 할 수 있도록 함
        loginCommand.setEmail(rCookie.getValue());
        loginCommand.setRememberEmail(true);
    }
    return "login/loginForm";
}

쿠키 생성

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

@Controller
@RequestMapping("/login")
public class LoginController{
    ...
        Cookie rememberCookie = 
              new Cookie("REMEMBER", loginCommand.getEmail());
        rememberCookie.setPath("/");
        if(loginCommand.IsRememberEmail()){
            rememberCookie.setMaxAge(60*60*24*30); // 30일동안 유지되는 쿠키
        } else{
            rememberCookie.setMaxAge(0); // 바로 삭제되는 쿠키
        }
        response.addCookie.setMaxAge(0);
    
    ...
}

 

Comments