1. 로그인 정보를 담기 위한 VO 객체
package spring;
// 로그인 정보를 담는 VO 클래스
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 isRemeberEmail() {
return rememberEmail;
}
public void setRememberEmail(boolean rememberEmail) {
this.rememberEmail = rememberEmail;
}
}
2. VO 객체에 대한 로그인 유효성 검사
package spring;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
// 로그인 검증해주는 클래스
public class LoginCommandValidator implements 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");
}
}
3. 로그인한 정보를 담을 세션 객체
package spring;
// 인증 정보를 담는 클래스 (세션에 사용할 예정)
public class AuthInfo {
private Long id;
private String email;
private String name;
public AuthInfo(Long id, String email, String name) {
super();
this.id = id;
this.email = email;
this.name = name;
}
public Long getId() {
return id;
}
public String getEmail() {
return email;
}
public String getName() {
return name;
}
}
4. 로그인 성공 / 실패를 판단하는 Service 로직
package spring;
// 로그인 정보를 확인하고 일치하면 세션(AuthInfo)에 저장하는 기능
public class AuthService {
private MemberDAO memberDao;
public void setMemberDao(MemberDAO memberDao) {
this.memberDao = memberDao;
}
// 로그인 정보 확인 로직
public AuthInfo authentication(String email, String password) {
Member member = memberDao.selectByEmail(email);
if(member == null) { // 멤버가 없으면
throw new IdPasswordNotMatchingException(); // 에러
}
if(!member.matchPassword(password)) { // 패스워드가 일치하지 않으면
throw new IdPasswordNotMatchingException(); // 에러
}
return new AuthInfo(member.getId(), member.getEmail(), member.getName());
// 일치하면 세 가지 정보를 인증 클래스에 저장
}
}
5. 이동을 제어해주는 Controller 클래스
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import spring.AuthInfo;
import spring.AuthService;
import spring.IdPasswordNotMatchingException;
import spring.LoginCommand;
import spring.LoginCommandValidator;
@Controller
@RequestMapping("/login")
public class LoginController {
private AuthService authService;
public void setAuthService(AuthService authService) {
this.authService = authService;
}
@RequestMapping(method=RequestMethod.GET)
public String form(LoginCommand loginCommand) {
return "login/loginForm";
}
@RequestMapping(method=RequestMethod.POST)
public String submit(LoginCommand loginCommand,
Errors errors,
HttpSession session) { // 세션 객체 추가
new LoginCommandValidator().validate(loginCommand, errors); // 유효성 검사하자
if(errors.hasErrors()) { // 검사 후 에러가 발생하면
return "login/loginForm";
}
try { // 에러가 발생하지 않으면
AuthInfo authInfo = authService.authentication( // 세션 객체 생성
loginCommand.getEmail(),
loginCommand.getPassword());
session.setAttribute("authInfo", authInfo); // 인증 정보 세션에 저장
return "login/loginSuccess"; // 성공 페이지로 보내줘
} catch(IdPasswordNotMatchingException e) { // 예외 발생하면
errors.reject("idPasswordNotMatching"); // 에러 발생
return "login/loginForm"; // 다시 로그인해
}
}
}
6. LoginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><spring:message code="login.title"/></title>
</head>
<body>
<form:form commandName="loginCommand">
<p>
<label>
<spring:message code="email"/>:
<form:input path="email"/>
<form:errors path="email"/>
</label>
</p>
<p>
<label>
<spring:message code="password"/>:
<form:input path="password"/>
<form:errors path="password"/>
</label>
</p>
<input type="submit" value="<spring:message code="login.btn"/>">
<form:errors/>
</form:form>
</body>
</html>
7. loginSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><spring:message code="login.title"/></title>
</head>
<body>
<p>
<spring:message code="login.done"/>
</p>
<p>
<a href="<c:url value='/main'/>">
[<spring:message code="go.main"/>]
</a>
</p>
</body>
</html>
8. 로그아웃 페이지로 이동하는 Controller 추가
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LogoutController {
@RequestMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/main";
}
}
9. label.properties 메세지 추가
login.title=로그인
login.btn=로그인하기
idPasswordNotMatching=아이디와 비밀번호를 확인해 주세요.
login.done=로그인 성공
10. xml에 Controller 추가
<bean class="controller.LoginController">
<property name="authService" ref="authService"/>
</bean>
<bean class="controller.LogoutController"/>
'SPRING' 카테고리의 다른 글
쿠키 @CookieValue (0) | 2020.10.13 |
---|---|
HandlerInterceptor : 세션을 미리 확인하자 (0) | 2020.10.12 |
비밀번호 변경하기 (0) | 2020.10.12 |
404 NOT_FOUND 처리하기 (0) | 2020.10.11 |
파일 업로드 처리 : MultipartResolver (0) | 2020.10.11 |