코딩하는 문과생

[Spring] 8. 스프링 기본(7) - Interceptor 본문

웹 프로그래밍/Spring

[Spring] 8. 스프링 기본(7) - Interceptor

코딩하는 문과생 2020. 2. 7. 14:27

[Practice]

선행과 후행 인터셉터

- preHandle은 반환형이 boolean이고,

- postHandle은 반환형이 void다.

 

1. 상속해서 Interceptor 객체생성

public class TestInterceptor extends HandlerInterceptorAdapter{
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("test interceptor preHandle ~~");
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("test interceptor postHandle ~~");
	}
}

2. 설정부여

	<!-- Intercepter 만들기 -->
	<beans:bean id="sample" class="com.sinc.intern.util.interceptor.TestInterceptor" />
	<interceptors>
		<interceptor>
			<mapping path="/interceptor.do"/>
			<beans:ref bean="sample"/>
		</interceptor>
	</interceptors>

3. RequestMapping

	@RequestMapping("/interceptor.do")
	public String interceptorSample() {
		System.out.println("ctrl interceptor");
		return null;
	}

4. 수정 - 출력 확인

public class TestInterceptor extends HandlerInterceptorAdapter{
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("test interceptor preHandle ~~");
		HandlerMethod 	method = (HandlerMethod)handler;
		Method			methodObj = method.getMethod();
		System.out.println("Bean : "+method.getBean().getClass());
		System.out.println("Method : " + methodObj);
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("test interceptor postHandle ~~");
	}
}

[Login에 Interceptor 넣기]

0. Ctrl 확인 - 로그인 후 세션 생성

	@RequestMapping(value="/login.do", method=RequestMethod.POST)

1. Interceptor생성

public class LoginInterceptor extends HandlerInterceptorAdapter{
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		System.out.println("login interceptor postH ~~");

	}
}

2. 설정에 등록

<!-- Intercepter 만들기 -->
	<beans:bean id="sample" class="com.sinc.intern.util.interceptor.TestInterceptor" />
	<beans:bean id="login" class="com.sinc.intern.user.util.LoginInterceptor" />
	<interceptors>
		<interceptor>
			<mapping path="/interceptor.do" />
			<beans:ref bean="sample" />
		</interceptor>
		<interceptor>
			<mapping path="/login.do" />
			<beans:ref bean="login" />
		</interceptor>
	</interceptors>

3.  Ctrl수정

	@RequestMapping(value="/login.do", method=RequestMethod.POST)
	public String login(UserDTO dto, Model model) { 
		System.out.println("user login dto : " + dto);
		Object user = service.login(dto);
		if(user != null) {
			//model.addAttribute("loginSession", user); 수정
			model.addAttribute("loginUserModel", user);
		}
		return "redirect:/main.do";
	}

4. Interceptor 수정 - 출력 확인

public class LoginInterceptor extends HandlerInterceptorAdapter{
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		System.out.println("login interceptor postH ~~");
		ModelMap model = modelAndView.getModelMap(); 
		//System.out.println(model.get("loginUserModel").getClass());
		Object obj = model.get("loginUserModel");
		if(obj != null) {
			HttpSession session = request.getSession();
			session.setAttribute("loginUser", obj);
		}
	}
}

0. Ctrl 확인 

	@RequestMapping("/registerForm.do")
	public String register() {

1. SessionChkInterceptor 추가 - 원래 가려던 uri저장

public class SessionChkInterceptor extends HandlerInterceptorAdapter {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("session interceptor preH ~~");
		HttpSession session = request.getSession();
		if( session.getAttribute("loginUser") == null) {
			System.out.println("session is null");
			String uri = request.getRequestURI();
			String query = request.getQueryString();
			String path = uri;
			if(request.getMethod().equalsIgnoreCase("get")) {
				path = uri + "?" + query;
			}
			session.setAttribute("dest", path);
			response.sendRedirect("/loginForm.do");
			return false;
		}
		return true;
	}
}

2. 설정 추가

<beans:bean id="check" class="com.sinc.intern.user.util.SessionChkInterceptor" />

		
<interceptor>
	<mapping path="/registerForm.do" />
	<beans:ref bean="check" />
</interceptor>

3. LoginInterceptor 수정 - 원래 가려더 uri로 보내버리기

public class LoginInterceptor extends HandlerInterceptorAdapter{
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		System.out.println("login interceptor postH ~~");
		ModelMap model = modelAndView.getModelMap(); 
		//System.out.println(model.get("loginUserModel").getClass());
		Object obj = model.get("loginUserModel");
		if(obj != null) {
			HttpSession session = request.getSession();
			session.setAttribute("loginUser", obj);
			
			Object destObj = session.getAttribute("dest");
			response.sendRedirect( destObj != null ? (String)destObj : "/main.do");
		}
	}
}

4. void로 변경(항상 main으로 리다이렉트 되기 때문에)

@RequestMapping(value="/login.do", method=RequestMethod.POST)
	public void login(UserDTO dto, Model model) { 

[LogoutInterceptor]

1. interceptor 추가

public class LogoutInterceptor extends HandlerInterceptorAdapter{
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("logout interceptor preH ~~");
		
		HttpSession session = request.getSession(false);
		session.invalidate();
		return true;
	}
}

2. 설정 추가

<beans:bean id="logout" class="com.sinc.intern.user.util.LogoutInterceptor"/>
<interceptor>
	<mapping path="/logout.do" />
	<beans:ref bean="logout" />
</interceptor>

3. UserCtrl 추가

	@RequestMapping("/logout.do")
	public String logout() {
		System.out.println("user logout");
		return "redirect:/main.do"; 
	}

4. header.jsp 추가

<a href="/user/logout.do" class="btn btn-default btn-flat">Sign out</a>