1. 비밀번호 변경을 위한 커맨드 객체 생성
package spring;
// 비밀번호 요청을 받아줄 커맨드 객체
public class ChangePwdCommand {
private String currentPassword;
private String newPassword;
public String getCurrentPassword() {
return currentPassword;
}
public void setCurrentPassword(String currentPassword) {
this.currentPassword = currentPassword;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
}
2. 비밀번호 변경 유효성 검사를 위한 Validator 객체 생성
package spring;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
// 검증해줄 객체
public class ChangePwdCommandValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return ChangePwdCommand.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
// 값이 비었는지만 확인
ValidationUtils.rejectIfEmpty(errors, "currentPassword", "required");
ValidationUtils.rejectIfEmpty(errors, "newPassword", "required");
}
}
3. 비밀번호를 변경해주는 쿼리가 담긴 DAO 로직
package spring;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
public class MemberDAO {
private JdbcTemplate jdbcTemplate;
public MemberDAO(DataSource dataSource) {
System.out.println("MemberDAO 객체 생성");
jdbcTemplate = new JdbcTemplate(dataSource);
}
public void update(Member member) {
jdbcTemplate.update(
"update member set name = ?, password = ? where email = ?",
member.getName(), member.getPassword(), member.getEmail());
}
}
4. 비밀번호를 변경해주는 Service 로직
package spring;
import org.springframework.transaction.annotation.Transactional;
// 비밀번호를 변경해주는 기능이 담긴 로직
public class ChangePasswordService {
private MemberDAO memberDao;
public ChangePasswordService(MemberDAO memberDao) {
this.memberDao = memberDao;
}
public void changePassword(String email, String oldPwd, String newPwd) {
Member member = memberDao.selectByEmail(email);
if(member == null) {
throw new MemberNotFoundException();
}
member.changePassword(oldPwd, newPwd); // 가져온 회원의 비밀번호 변경
memberDao.update(member); // 데이터베이스에 변경된 정보를 반영
}
}
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.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import spring.AuthInfo;
import spring.ChangePasswordService;
import spring.ChangePwdCommand;
import spring.ChangePwdCommandValidator;
import spring.IdPasswordNotMatchingException;
@Controller
@RequestMapping("/edit/changePassword")
public class ChangePwdController {
private ChangePasswordService changePasswordService;
public void setChangePasswordService(ChangePasswordService service) {
this.changePasswordService = service;
}
@RequestMapping(method=RequestMethod.GET)
public String form(@ModelAttribute("command") ChangePwdCommand pwdCmd) {
return "edit/changePwdForm";
}
@RequestMapping(method=RequestMethod.POST)
public String submit(
@ModelAttribute("command")ChangePwdCommand pwdCmd,
Errors errors,
HttpSession session) {
new ChangePwdCommandValidator().validate(pwdCmd, errors);
if(errors.hasErrors()) {
return "edit/changePwdForm";
}
AuthInfo authInfo = (AuthInfo)session.getAttribute("authInfo");
try {
changePasswordService.changePassword(
authInfo.getEmail(),
pwdCmd.getCurrentPassword(),
pwdCmd.getNewPassword());
return "edit/changePwd";
}catch(IdPasswordNotMatchingException e) {
errors.rejectValue("currentPassword", "notMatching");
return "edit/changePwdForm";
}
}
}
6. edit/changePwdForm.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="change.pwd.title"/></title>
</head>
<body>
<form:form>
<p>
<label><spring:message code="currentPassword"/>
<form:password path="currentPassword"/>
<form:errors path="currentPassword"/>
</label>
</p>
<p>
<label><spring:message code="newPassword"/>
<form:password path="newPassword"/>
<form:errors path="newPassword"/>
</label>
</p>
<input type="submit" value="<spring:message code="change.btn"/>">
</form:form>
</body>
</html>
7. edit/changePwd.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="change.pwd.title"/></title>
</head>
<body>
<p>
<spring:message code="change.pwd.done"/>
</p>
<p>
<a href="<c:url value='/main'/>">
[<spring:message code="go.main"/>]
</a>
</p>
</body>
</html>
8. label.properties 메세지 작성
change.pwd.title=비밀번호 변경
currentPassword=현재 비밀번호
newPassword=새 비밀번호
change.btn=변경하기
notMatching.currentPassword=비밀번호를 잘못 입력하였습니다.
change.pwd.done=비밀번호를 변경하였습니다.
9. xml에 controller 의존 추가
<bean class="controller.ChangePwdController">
<property name="changePasswordService" ref="changePwdSvc"/>
</bean>
'SPRING' 카테고리의 다른 글
HandlerInterceptor : 세션을 미리 확인하자 (0) | 2020.10.12 |
---|---|
로그인 / 로그아웃 / 세션 (0) | 2020.10.12 |
404 NOT_FOUND 처리하기 (0) | 2020.10.11 |
파일 업로드 처리 : MultipartResolver (0) | 2020.10.11 |
Model 객체 / @ModelAttribute (0) | 2020.10.11 |