ch13. MVC 3: 세션 /인터셉터 / 쿠키

728x90

ch13. MVC 3: 세션 /인터셉터 /쿠키 

[이 장 학습 내용 ]

-HttpSession 사용 -> 세션 정보 저장 
-HandlerInterceptor -> 인터셉터 사용하여 여러 컨트롤러에 공통 기능 적용 
-쿠키 접근 

1. [프로젝트 준비] : 11, 12장 내용과 동일

2. [로그인 처리 위한 코드 준비]

<로그인 처리>
AutoInfo.java //로그인 성공 시 인증상태 정보 세션 보관용
Member.java matchPassword() //멤버의 암호일치 여부 확인 메소드 추가
AuthService.java //이메일, 비번 일치 여부 확인


<로그인 요청 처리>
LoginCommand.java //폼에 입력한 값 전달받을 용도의 커맨드 객체
LoginCommandValidator.java //커맨드 객체 검사용
LoginController.java //로그인 요청 처리 컨트롤러


<>
loginForm.jsp //로그인 폼 뷰
loginSuccess.jsp //로그인 성공 뷰


<메시지 내용 파일>
label.properties //뷰에 출력할 메시지 내용 작성 프로퍼티 파일

▶<<로그인 처리>>

[AuthInfo.java]

public class AuthInfo { //인증 상태 정보 세션 보관 시 사용 
	//필드 
	private Long id;
	private String email;
	private String name;
	//생성자 
	public AuthInfo(Long id, String email, String name) {
		this.id = id;
		this.email = email;
		this.name = name;
	}
	public Long getId() {
		return id;
	}
	public String getEmail() {
		return email;
	}
	public String getName() {
		return name;
	}
}

[Member.java] matchPassword() 추가

public class Member { 
 	...        
	 //멤버의 패스워드 일치 여부 확인용 메소드 추가 
	public boolean matchPassword(String password) {
		return this.password.equals(password);
	}
}

[AutoService.java]

public class AuthService { //이메일, 비번 일치 여부 확인용 
	private MemberDao memberDao;
	public void setMemberDao(MemberDao memberDao) {
		this.memberDao = memberDao;
	}
	//이메일, 비번 일치 여부 확인 메소드 
	public AuthInfo authenticate(String email, String password) {
		Member member = memberDao.selectByEmail(email);
		if (member == null) { //이메일에 해당 멤버 없는 경우 
			throw new WrongIdPasswordException(); //오류 
		}
		if (!member.matchPassword(password)) { //멤버에 해당 이베일의 비번 불일치 
			throw new WrongIdPasswordException(); //오류 
		}
		//이메일, 비번 일치한 경우 
		return new AuthInfo(member.getId(), //AutoInfo 객체 생성 
				member.getEmail(),
				member.getName());
	}
}

▶<<로그인 요청 처리>>

[LoginCommand.java]

public class LoginCommand { //폼에 입력된 값 전달받을 커맨드 객체 생성 
	//필드 
	private String email;
	private String password;
	private boolean rememberEmail;
	//메소드 
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public boolean isRememberEmail() {
		return rememberEmail;
	}
	public void setRememberEmail(boolean rememberEmail) {
		this.rememberEmail = rememberEmail;
	}
}

[LoginCommandValidator.java]

public class LoginCommandValidator implements Validator { //커맨드 객체 검사용 Validator
	@Override
	public boolean supports(Class<?> clazz) {
		return LoginCommand.class.isAssignableFrom(clazz);
	}
	@Override
	public void validate(Object target, Errors errors) {
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "required");
		ValidationUtils.rejectIfEmpty(errors, "password", "required");
	}
}

[LoginController.java] //로그인 요청 컨트롤러

@Controller
@RequestMapping("/login")
public class LoginController { //로그인 요청 컨트롤러 
    private AuthService authService;
    public void setAuthService(AuthService authService) {
        this.authService = authService;
    }
    @GetMapping
    public String form(LoginCommand loginCommand,
		...
    	return "login/loginForm"; //다시 로그인 폼 뷰
    }
    @PostMapping
    public String submit(
    		LoginCommand loginCommand, Errors errors, HttpSession session,
    		HttpServletResponse response) {
        new LoginCommandValidator().validate(loginCommand, errors);
        if (errors.hasErrors()) {
            return "login/loginForm"; //다시 로그인 폼 뷰 
        }
... 
}

▶<>

loginForm.jsp //로그인 폼 뷰

loginSuccess.jsp //로그인 성공 뷰


▶<메시지 내용 파일>

label.properties //뷰에 출력할 메시지 내용 작성 프로퍼티 파일

-> 이제 로그인 처리에 필요한 기반 코드 작성 완료

3. [컨트롤러에서 HttpSession 사용] : 로그인 상태 유지하는 방법

- 로그인 성공 후 인증 정보를 세션에 담아야 로그인 상태가 유지됨

<컨트롤러에서 HttpSession 사용하는 방식 2가지>

요청 매핑 적용 메소드의 파라미터에 HttpSession 추가
요청 매핑 적용 메소드의 파라미터에 HttpServletRequest 추가, 이 타입의 getSession() 메소드 이용

-로그인 성공 시 HttpSessionauthInfo 속성에 인증 정보 객체를 저장

@Controller
@RequestMapping("/login")
public class LoginController {
  ...
    @PostMapping
    public String submit(
    		LoginCommand loginCommand, Errors errors, HttpSession session) {
        new LoginCommandValidator().validate(loginCommand, errors);
        if (errors.hasErrors()) {
            return "login/loginForm";
        }
        try {
            AuthInfo authInfo = authService.authenticate(
                    loginCommand.getEmail(),
                    loginCommand.getPassword());
            
            session.setAttribute("authInfo", authInfo); //로그인 성공 시 세션 정보 autoInfo 속성에 저장

-로그아웃 시 컨트롤러 클래스는 HttpSession을 제거

@Controller
public class LogoutController {
	@RequestMapping("/logout")
	public String logout(HttpSession session) {
		session.invalidate(); //로그아웃 시 세션 정보 삭제 
		return "redirect:/main";
	}
}

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

ChangePwdCommand // 커맨드 객체
ChangePwdCommandValidator //커맨드 객체 검증 Validator
ChangePwdContoller // 비번 변경 요청 처리 컨트롤러
changePwdForm.jsp //비번 변경 뷰
changedPwd.jsp //변경된 비번 뷰
label.properies에 메시지 추가
ContollerConfig 설정 클래스에 새 컨트롤러를 빈으로 추가

5. [인터셉터 사용하기]

-다수의 컨트롤러에 대해 동일한 기능 적용하기

[HandlerInteceptor 인터페이스] 내부 메소드 재정의하여 사용

-이 인터페이스를 사용하면 3가지 시점에 공통 기능을 넣을 수 있다.

(1) boolean preHandle() : 컨트롤러(핸들러) 실행 전 처리

(2) void postHandle() : 컨트롤러(핸들러) 실행 후(뷰 실행 전) 추가 기능 처리

(3) void afterCompletion() : 
뷰 실행 후 처리

6. [컨트롤러에서 쿠키 사용] : 이메일 기억하기 기능 구현하는 방법

-<구현 방식>

(1) 로그인 폼에 이메일 기억하기옵션 추가

(2) 로그인 시 이베일 기억하기옵션 선택자에 한해, 로그인 성공 후 쿠키에 이메일 저장
                                          //웹 브라우저 닫더라도 삭제되지 않도록 쿠키 유효시간 길게 설정

(3)
이후 로그인 폼 보일 때, 이메일을 저장한 쿠키 존재하면 해당 입력 폼에 이메일 보여줌

728x90