우선 view의 login.jsp의 form 부분을 jstl의 form 태그로 고치겠다.
<form:form action="${root }user/login_pro" method="post" modelAttribute="tempLoginUserBean">
<div class="form-group">
<form:label path="user_id">아이디</form:label>
<form:input path="user_id" class="form-control"/>
<form:errors path="user_id" style="color:red"/>
</div>
<div class="form-group">
<form:label path="user_pw">비밀번호</form:label>
<form:password path="user_pw" class="form-control"/>
<form:errors path="user_pw" style="color:red"/>
</div>
<div class="form-group text-right">
<form:button class="btn btn-primary">로그인</form:button>
<a href="${root }user/signIn" class="btn btn-danger">회원가입</a>
</div>
</form:form>
UserBean에서 로그인 여부를 판별할 isLogin이라는 불리언 변수를 생성한다.
로그인 여부에 따라 기능에 차이가 있어야 하므로 UserBean을 Session 영역에 저장한다.
RootAppContext에 아래 코드를 넣는다.
@Bean("loginUserBean")
@SessionScope
public UserBean loginUserBean() {
return new UserBean();
}
로그인화면에서 유효성 검사를하기 위해 error_message에 에러메세지를 추가해준다.
Size.tempLoginUserBean.user_id = 사용자 아이디는 4 ~ 20글자여야 합니다.
Size.tempLoginUserBean.user_pw = 비밀번호는 4 ~ 20글자여야 합니다.
Pattern.tempLoginUserBean.user_id = 사용자 아이디는 영어, 숫자만 허용합니다.
Pattern.tempLoginUserBean.user_pw = 비밀번호는 영어, 숫자만 허용합니다.
가운데 Bean의 이름만 다른 것을 알 수 있다.
login처리를 위해 controller에 코드를 추가한다.
@PostMapping("user/login_pro")
public String login_pro(@Valid @ModelAttribute("tempLoginUserBean") UserBean tempLoginUserBean, BindingResult result) {
if(result.hasErrors()) {
return "user/login";
}
return "user/login_pro";
}
서버를 실행시켜보면 오류가 뜨는 것을 알 수 있다.
이유는 Validator 때문인데, 회원 가입했을 때 UserBean에 대해 Validator가 검사한 코드에 의해 오류가 검출되었기 때문이다. 바로 아이디, 닉네임 중복확인 여부를 검사하는 validator인데, 로그인 할 때는 중복확인 여부가 필요 없으므로 수정을 해준다.
String beanName = errors.getObjectName();
if (beanName.equals("signInUserBean")) {
if (userBean.getUser_pw().contentEquals(userBean.getUser_pw2()) == false) {
errors.rejectValue("user_pw", "NotEquals");
errors.rejectValue("user_pw2", "NotEquals");
}
if (userBean.isUserIdExist() == false) {
errors.rejectValue("user_id", "UserIdExist");
}
if (userBean.isNicknameExist() == false) {
errors.rejectValue("user_nickname", "NicknameExist");
}
}
이렇게 bean이름이 회원가입에 쓰는 signInUserBean일 때만 검사를 하도록 하면 오류가 발생하지 않는다.
로그인시 아이디와 비밀번호가 맞는지 확인하기 위한 mapper를 작성하자.
@Select("select user_idx, user_name " +
"from user_table " +
"where user_id=#{user_id} and user_pw=#{user_pw}")
UserBean loginUser(UserBean tempLoginUserBean);
dao를 작성한 후 service도 작성한다.
세션 영역에 저장한 loginUserBean을 받아온 후 로그인에 성공하면 loginUserBean에 idx, name을 입력하고, login여부를 true로 설정한다.
@Resource(name="loginUserBean")
private UserBean loginUserBean;
public void loginUser(UserBean tempLoginUserBean) {
UserBean tempLoginUserBean2 = userDao.loginUser(tempLoginUserBean);
if(tempLoginUserBean2 != null) {
loginUserBean.setUser_idx(tempLoginUserBean2.getUser_idx());
loginUserBean.setUser_name(tempLoginUserBean2.getUser_name());
loginUserBean.setLogin(true);
}
}
controller도 주입받고 코드를 작성한다.
@Resource(name="loginUserBean")
private UserBean loginUserBean;
@PostMapping("user/login_pro")
public String login_pro(@Valid @ModelAttribute("tempLoginUserBean") UserBean tempLoginUserBean, BindingResult result) {
if(result.hasErrors()) {
return "user/login";
}
userService.loginUser(tempLoginUserBean);
if(loginUserBean.isLogin()==true) {
return "user/login_success";
}
else {
return "user/login_fail";
}
}
loginUserBean의 isLogin이라는 변수가 true면 로그인 성공으로, 실패면 로그인 실패로 맵핑한다.
이제 로그인 view 화면에 로그인이 실패했을 때만 로그인 실패 정보를 보여주도록 수정한다.
<c:if test="${fail==true}">
<div class="alert alert-danger">
<h4>로그인 실패</h4>
<p>아이디 또는 비밀번호를 확인해주세요</p>
</div>
</c:if>
c tag를 이용해 넘어온 fail변수가 true면 경고를 띄운다.
fail은 login_fail을 통해 넘어온다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var='root' value="${pageContext.request.contextPath}/"/>
<script>
alert('로그인에 실패했습니다.')
location.href="${root}user/login?fail=true"
</script>
login_fail.jsp이다. fil=true를 통해 로그인에 실패했음을 전달하고,
Controller에서 이를 login.jsp로 전달한다.
@GetMapping("user/login")
public String login(@ModelAttribute("tempLoginUserBean") UserBean tempLoginUserBean,
@RequestParam(value = "fail", defaultValue="false") boolean fail,
Model model) {
model.addAttribute("fail",fail);
return "user/login";
}
login_success는 아래와 같이 구현한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var='root' value="${pageContext.request.contextPath}/"/>
<script>
alert('로그인 되었습니다.')
location.href = "${root}main"
</script>
'프로젝트 > 게시판미니프로젝트' 카테고리의 다른 글
[프로젝트] 회원 정보 수정 (0) | 2020.05.08 |
---|---|
[프로젝트] 상단 메뉴 처리, 및 로그아웃 (0) | 2020.05.08 |
[프로젝트] 회원가입 - 아이디 중복 확인, 회원 가입 정보 저장 (0) | 2020.05.08 |
[프로젝트] 회원가입 관리 (0) | 2020.05.07 |
[프로젝트] 상단 메뉴 관리 (0) | 2020.05.07 |