화면
로그인 처리 화면
회원가입된 Database에 저장된 회원인지 여부 확인
interceptor를 통해서 통과된 사용자 session 등록
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- el 태그르 사용하기 위해서 사용 -->
<%@ include file="../include/header.jsp"%>
<section>
<div class="container">
<div class="row">
<div class="col-lg-6 col-md-7 col-xs-10 login-form">
<div class="titlebox">
로그인
</div>
<form id = "formObj" action="<c:url value='/user/userLogin' />" method="post">
<div class="form-group"><!--사용자클래스선언-->
<label for="id">아이디</label>
<input type="text" class="form-control" id="id" name="id" placeholder="아이디">
</div>
<div class="form-group"><!--사용자클래스선언-->
<label for="pw">비밀번호</label>
<input type="password" class="form-control" id="pw" name ="pw" placeholder="비밀번호">
</div>
<div class="form-group">
<button type="button" id = "loginBtn" class="btn btn-info btn-block">로그인</button>
<button type="button" id = "registBtn" class="btn btn-primary btn-block">회원가입</button>
</div>
</form>
</div>
</div>
</div>
</section>
<%@ include file="../include/header.jsp"%>
<script>
const msg = '$(msg)';
if (msg === 'joinSuccess'){
// 회원가입한 후 login으로 화면이동 할 때 msg의 값도 같이 보내기 때문에
// alert창도 이렇게 작성
alert('회원 가입 정상 처리 되었습니다.');
} else if(msg ==="loginFail"){
alert('로그인 실패입니다.');
}
$(function(){
$('#loginBtn').click(function() {
if ($('#id').val() === '' || $('#pw').val() === ''){
alert('아이디 혹은 비밀번호는 필수 값입니다.');
return;
}
$('#formObj').submit();
}); // 로그인 전송 끄읏~
$('#registBtn').click(function() {
location.href='<c:url value="/user/userJoin" />';
});
}); // end jquery
</script>
Login 처리를 수행하기 위해 클라이언트에서 입력한 데이터를 controller가 받아서 service와 mapper를 통해 db에 전달해서 Login 검증 처리
Interceptor 활용하여 session 정보 저장하는 로직 수행
// 로그인 페이지 이동
@GetMapping("/userLogin")
public String moveLogin() {
System.out.println("/user/userLogin : GET");
return "/user/userLogin";
}
// 로그인 검증
@PostMapping("/userLogin")
public String Login(@RequestParam("id") String id, @RequestParam("pw") String pw, Model model) {
System.out.println("/user/userLogin : POST");
UserVO loginUser = service.login(id, pw);
/* user 정보를 model에 담아서 리턴은 /user/userLogin으로 셋팅
util 패키지 안에 인터셉터(UserLoginSuccessHandler)를 생성해서
UserLoginSuccessHandler는 로그인 처리 이후 실행되는 핸들러를 오버라이딩 해서
모델의 객체의 값이 null인지 아닌지 확인하고 null이라면 msg라는 이름으로 loginFail이라는 문자를 담아서
userLogin.jsp 파일로 응답하도록 viewName을 세팅하고 null이 아니라면 세션 만들어서 홈 화면으로 이동
*/
model.addAttribute("loginUser", loginUser);
return "/user/userLogin";
}
controller 요청 전 후에 값을 가지고 와서 검증
interceptor를 bean으로 등록하기 위해서는 root-context.xml에 작성했는데 이제는 파일로 생성해서 따로 관리
Spring bean configuration file로 생성해서 namespace에 mvc 체크
interceptor-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- namespaces 탭에서 mvc 기능 추가 -->
<!-- web.xml에 초기 설정 파일로 이 파일을 추가 -->
<bean id="userLoginSuccessHandler" class="com.spring.myweb.util.interceptor.UserLoginSuccessHandler" />
<mvc:interceptors>
<!-- root-context.xml에 등록하는 거랑 똑같음 -->
<!-- 로그인 이후에 실행되는 postHandler -->
<mvc:interceptor>
<mvc:mapping path="/user/login"/>
<ref bean="userLoginSuccessHandler" />
<!-- 참조하는 bean 지정 -->
</mvc:interceptor>
</mvc:interceptors>
</beans>
web.xml에 생성한 파일도 추가
web.xml
<!-- Processes application requests -->
<servlet>
<!-- 디스패처 서플릿이 실행될 때 같이 실행되는 파일들 -->
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
/WEB-INF/spring/email-config.xml
/WEB-INF/spring/interceptor-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
로그인을 성공했다면 정보를 유지하기 위해 session에 해당 정보를 저장하는 로직 수행
package com.spring.myweb.util.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.spring.myweb.command.UserVO;
// controller의 login 요청 전과 후의 데이터를 가로채서 정제
// interceptor class를 만들려면 HandlerInterceptor 인터페이스 구현
public class UserLoginSuccessHandler implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("로그인 요청이 들어가기 전 인터셉터 발동");
// System.out.println("파라미터 값 가져오는지 확인 " + request.getParameter("id"));
// 될려나
// 되넴
return true;
}
// controller에서 데이터 처리 후 디스패처에 보내기 전 가져와서 확인
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HttpSession session = request.getSession();
System.out.println("로그인 요청 후 디스패처에게 가기 전 인터셉터 발동");
// Object user = modelAndView.getModel().get("loginUser");
ModelMap mv = modelAndView.getModelMap();
// model 객체에 있는 것을 ModelMap 타입으로 반환해줌
UserVO user = (UserVO) mv.get("loginUser");
// ModelMap객체에서 값을 가져올 수 있음
System.out.println("인터셉터에서 불러온 유저 데이터 : " + user);
if (user == null) {
modelAndView.addObject("msg", "loginFail");
modelAndView.setViewName("/user/userLogin");
} else {
System.out.println("로그인 성공 로직");
// 로그인을 성공했으면 session을 생성해서 로그인 유지할 수 있는 수단으로 사용
session.setAttribute("login", user);
// 세션 저장
response.sendRedirect("/myweb/");
}
}
}