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() 메소드 이용 |
-로그인 성공 시 HttpSession의 authInfo 속성에 인증 정보 객체를 저장함
@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
'Web(웹)_관련 공부 모음 > [개념]_스프링 5 프로그래밍' 카테고리의 다른 글
ch15. 간단한 웹 어플리케이션 구조 (0) | 2022.02.03 |
---|---|
ch14. MVC 4: 날짜 값 변환/@PathVariable/익셉션 처리 (0) | 2022.02.03 |
ch 12. MVC 2: 메시지 / 커맨드 객체 검증 (0) | 2022.02.02 |
ch11. MVC 1: 요청 매핑/커맨드 객체/ 리다이렉트/ 폼 태그/모델 (0) | 2022.02.01 |
ch10. 스프링 MVC 프레임워크 동작 방식 (0) | 2022.01.31 |