package kr.or.ddit.controller.intercept;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.ui.ModelMap;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LoginInterceptor extends HandlerInterceptorAdapter{
private static final String USER_INFO = "userInfo";
// 지정된 컨트롤러의 동작 이전에 가로채는 역할로 사용한다.
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("preHandler...!");
String requestURL = request.getRequestURL().toString(); // <http://localhost/login1>
String requestURI = request.getRequestURI().toString(); // /login1
log.info("requestURL : " + requestURL);
log.info("requestURI : " + requestURI);
HandlerMethod method = (HandlerMethod) handler;
Method methodObj = method.getMethod();
log.info("Bean : " + method.getBean()); // kr.or.ddit.controller.login.LoginController@3213h123
log.info("method : " + methodObj); // public java.lang.String kr.or.ddit.controller.login.LoginController.loginForm()
// 키 'userInfo'를 가지고 있는 세션이 존재하면 삭제 처리로 초기화
HttpSession session = request.getSession();
if(session.getAttribute(USER_INFO) != null) {
session.removeAttribute(USER_INFO);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("postHandle...!");
String requestURL = request.getRequestURL().toString(); // <http://localhost/login1>
String requestURI = request.getRequestURI().toString(); // /login1
log.info("requestURL : " + requestURL);
log.info("requestURI : " + requestURI);
HandlerMethod method = (HandlerMethod)handler;
Method methodObj = method.getMethod();
log.info("Bean : " + method.getBean());
log.info("Method : " + methodObj);
HttpSession session = request.getSession();
// 컨트롤러 메소드를 거쳤다가 postHandle로 넘어오면서 전달된 user라는 키에 value로 member가 담긴 값이
// Model에 담겨져 있다. 그중에 'user'로 넘긴 값이 로그인 후 인증된 회원 1명의 정보가 담긴 MemberVO 자바빈즈 객체가 되고
// 객체가 null이 아닌경우 메인화면으로 리다이렉트 처리한다.
ModelMap modelMap = modelAndView.getModelMap();
Object member = modelMap.get("user");
// 넘겨받은 데이터가 null이 아닌 경우 세션에 등록한다.
if(member != null) {
log.info("member : " + member);
log.info("member != null");
session.setAttribute(USER_INFO, member);
response.sendRedirect("/");
}
}
// DispatcherServlet의 화면 처리가 완료된 상태에서 처리한다.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
log.info("afterCompletion...!");
String requestURL = request.getRequestURL().toString(); // <http://localhost/login1>
String requestURI = request.getRequestURI().toString(); // /login1
log.info("requestURL : " + requestURL);
log.info("requestURI : " + requestURI);
HandlerMethod method = (HandlerMethod)handler;
Method methodObj = method.getMethod();
log.info("Bean : " + method.getBean());
log.info("Method : " + methodObj);
}
}
package kr.or.ddit.controller.login;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.MemberVO;
@Controller
public class LoginController {
@RequestMapping(value="/login1", method = RequestMethod.GET)
public String loginForm() {
return "login/loginForm";
}
@RequestMapping(value="/login1", method = RequestMethod.POST)
public String login(String userId, String userPw, Model model) {
MemberVO member = new MemberVO();
member.setUserId(userId);
member.setUserPw(userPw);
member.setUserName("홍길동");
model.addAttribute("user", member);
return "login/success";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Login Page</h1>
<form action="/login1" method="post">
아이디 : <input type="text" name="userId">
비밀번호 : <input type="text" name="userPw">
<input type="submit" value="Login">
</form>
</body>
</html>
로그인 화면이다.

로그인을 진행 하면 postHandle() 메서드에서 해당 member가 널이 아니면 해당 유저를 세션에 저장하고 메인 화면으로 redirect 되는 것을볼 수 있다.

