LoginInterceptor.java

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);
		
	}

}

LoginController.java

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";
	}
}

loginForm.jsp

<%@ 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>

로그인 화면이다.

Untitled

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

Untitled

Untitled