스터디/스프링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
- 로그인 하지 않은 경우 컨트롤러를 실행하지않도록
- 컨트롤러 실행 전 컨트롤러에서 필요로 하는 정보 생성
- 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);
...
}