본문 바로가기

SPRING

로그인 / 로그아웃 / 세션

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