다가오는 다음을 향해

[Spring MVC] 핸들러 인터셉터 (HandlerInterceptor)-로그인인증 본문

국비학원 공부노트/Spring MVC

[Spring MVC] 핸들러 인터셉터 (HandlerInterceptor)-로그인인증

hyeseo 2022. 4. 14. 00:48

[ 개발환경 ]
MacBook Air M1 2020년형 
eclipse [2021-3 var]
Java [zulu-8]
JSP
Tomcat [Apache Tomcat/9.0.58]

[ version ]
- springframework - 4.3.14
- aspectj - 1.8.9
- Test - 4.12

Maven repository
- mysql-connector-java  8.0.27
- spring-jdbc - 4.3.14
- spring-test - 4.3.14


mybatis - 3.4.4
mybatis-spring - 1.3.1


 

 

핸들러 인터셉터  (HandlerInterceptor)

 

 

핸들러 인터셉터 (HandlerInterceptor)란?


클라이언트의 요청을 DispatcherServlet이 컨트롤러를 요청하기 전, 후 응답을 가로채서 전, 후 처리를 할 수 있도록 제공해준다.

HandlerInterceptor 는 직접적으로 사용할 수 없기 때문에 클래스를 상속받아 사용자정의로 구현해야한다.

 

비슷한 역할로 Filter와 AOP가 있다.

 

Fliter는 Spring Framework와 무관하게 동작하며, Spring 자원을 이용할 수 없습니다. Filter는 보통 인코딩, XSS방어 등...의 용도로 이용됩니다.

 

AOP는 주로 비즈니스 로직에서 실행됩니다. Logging, transaction 처리 등 중복 코드가 발생할 경우 중복을 줄이기 위해 사용되며, 메소드 처리 전후 지점에 자유롭게 설정이 가능하다.

 

 

 

 

HandlerInterceptor 메소드


preHandle: controller가 요청을 처리하기 전 호출하는 메소드 

postHandle: 예외가 발생하지 않은 경우에만 controller가 작업이 끝나면 호출되는 메소드

afterCompletion: 예외 발생여부에 관계 없이 controller가 작업이 끝나면 호출되는 메소드

 

 

 

회원인증 구현하기


1. HandlerInterceptor 를 implements 하여 AuthenticationInterceptor.java 클래스를 만든다.

 

2. AuthenticationInterceptor.java 를 작성한다.

package kr.co.dong.common;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;


// 회원인증(로그인인증)
public class AuthenticationInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 클라이언트에 부여한 세션을 가져온다.
		HttpSession session = request.getSession();
		// 세션이 없다면 (로그인이 아니라면)->로그인으로 이동
		if (session.getAttribute("user")== null) {
			response.sendRedirect(request.getContextPath()+"/board/login");
			return false;
		}
		return true; // 로그인 상태라면 통과
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub

	}

}

 

3.servlet-context.xml에 인터셉터 설정 정보를 등록한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="kr.co.dong"/>
	<context:component-scan base-package="kr.co.imh"/>
	
	<!-- AOP 실행을 위해 컴포넌트 등록 -->
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	
	<!-- 인터셉터 설정 -->
	<beans:bean class="kr.co.dong.common.AuthenticationInterceptor" id="auth"/>
	
	<!-- 인터셉터를 위한 매핑경로를 설정하여 auth 메소드를 수행한다 -->
	<interceptors>
		<interceptor>
			<mapping path="/board/register"/>
			<mapping path="/board/detail"/>
			<mapping path="/board/update"/>
			<beans:ref bean="auth"/>
		</interceptor>
	</interceptors>
	
</beans:beans>