다가오는 다음을 향해
[Spring MVC] 핸들러 인터셉터 (HandlerInterceptor)-로그인인증 본문
[ 개발환경 ]
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>
'국비학원 공부노트 > Spring MVC' 카테고리의 다른 글
[Spring MVC] 게시글 자동등록 - 단위테스트 (0) | 2022.04.14 |
---|---|
[Spring MVC] 댓글 구현(게시판 구현 후 ) (0) | 2022.04.14 |
[Spring MVC] 게시판 구현 (0) | 2022.04.13 |
[Spring MVC] DB 로그인, 로그아웃 구현 (0) | 2022.03.16 |
[Spring MVC] 기본동작 구현 (0) | 2022.03.15 |