인터셉터

허상무·2021년 6월 2일
0

인터셉터란?

Controller에 들어오는 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할

정식명칭은 "Handler Interceptor"

DispatcherServlet이 컨트롤러를 요청하기 전, 후에 요청과 응답을 가로채서 가공할 수 있도록 해준다.

로그인 기능을 쓸 때, 로그인을 한 사람만 볼 수 있는 페이지가 있고, 로그인 한 사람만 글을 작성할 수 있다고 했을때, 컨트롤러 마다 로그인 확인 로직이 들어가는 것 보다 지정한 컨트롤러가 실행되기전 인터셉터를 이용하여 미리 확인하는 매서드를 실행 시키는것이 효율적이고 편리함.

interceptor && Filter

공통점

둘 다 Controller로 들어가는 요청을 가로채 특정 작업을 하기 위한 용도로 사용

차이점

적용 범위
Filter은 어플리케이션 내에서만 접근가능
Interceptor는 스프링에서 관리하기 때문에 스프링내의 모든 객체에 접근이 가능.

용도
JSP Filter의 경우 주로 한글처리에 이용되고
Interceptor의 경우 로그인할 때 이용

호출시점
Filter는 DispatcherServlet이 실행되기 전
Interceptor는 DispatcherServlet이 실행된 후

설정위치
Filter는 web.xml
Interceptor은 spring-servlet.xml

구현방식
Filter는 web.xml에서 설정을 하면 구형이 가능
Interceptor는 설정 + 메서드 구현이 필요

<!-- Interceptors 사용 예제-->

<mvc:interceptors>
        <mvc:interceptor>
        	<mvc:mapping path="/main/*.do"/>
            <mvc:mapping path="/svcReq/*.do"/>
            <mvc:mapping path="/stats/*.do"/>
            <mvc:mapping path="/analysis/*.do"/>
            <mvc:mapping path="/code/*.do"/>
            <mvc:mapping path="/user/*.do"/>
            <mvc:mapping path="/member/*.do"/>
            <mvc:mapping path="/cm/**/*.do"/>
            <mvc:mapping path="/hi/**/*.do"/>
            <mvc:mapping path="/dm/**/*.do"/>
            <mvc:exclude-mapping path="/main/*.do"/>
            <mvc:exclude-mapping path="/member/*.do"/>
            <mvc:exclude-mapping path="/cm/**/*.do"/>
            <mvc:exclude-mapping path="/hi/**/*.do"/>
            <mvc:exclude-mapping path="/dm/**/*.do"/>
            <mvc:exclude-mapping path="/uia/selectUsrList.do"/>
            <mvc:exclude-mapping path="/uia/loginPage.do"/>
            <mvc:exclude-mapping path="/uia/loginAction.do"/>
		    <bean class="com.app.****.****.com.interceptor.AuthenticInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>
public class Intercepter extends HandlerInterceptorAdapter{
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 컨트롤러 실행전 로그인을 확인하는 로직
        return super.preHandle(request, response, handler);
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // preHandle() 에서 return후 화면을 보여주기전 실행되는 로직 
        // log??
        super.postHandle(request, response, handler, modelAndView);
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 화면구현까지 끝난 후 실행되는 로직
        super.afterCompletion(request, response, handler, ex);
    }
 
}

class && method

Spring에서 인터셉터를 지원하기 위해

HandlerInterceptor 인터페이스
HandlerInterceptorAdapter 추상 클래스를 지원.
-> HandlerInterceptor를 쉽게 쓰기위해 구현한 추상클래스

HandlerInterceptorAdaptor

1) public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

Controller로 요청이 들어가기 전에 수행
ex) 로그인

2) postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView)

컨트롤러의 메서드의 처리가 끝나 return 되고 화면을 띄어주는 처리가 되기 직전에 실행

ModelAndView 객체에 컨트롤러에서 전달해 온 Model 객체가 전달됨으로 컨트롤러에서 작업 후 postHandle Method에서 작업할 것이 있다면 ModelAndView를 이용하면 됨.

3) afterCompletion()

컨트롤러가 수행되고 화면처리까지 끝난 뒤 호출된다.

참조

https://to-dy.tistory.com/21
https://rongscodinghistory.tistory.com/2
https://victorydntmd.tistory.com/176

profile
극초보개발새발자

0개의 댓글