티스토리 뷰

spring

filter, interceptor, aop

일상다반ㅅㅏ 2019. 3. 23. 19:59

로그인(세션) 체크, 권한 체크, XSS(Cross site script) 방어, pc/모바일 분기처리, 로그, 페이지 인코딩 변환 등

공통업무로 모든 페이지마다 작성해야할 코드가 있다.

이런 중복되는 코드들을 자동으로 처리할 수 있는 방법엔 filter, interceptor, aop가 있다.


(그림필요)

- interceptor와 filter는 servlet 단위에서 실행되고 aop는 메소드 앞의 proxy패턴 형태로 실행된다.

- 실행 순서는 filter > interceptor > aop > interceptor > filter 순으로 거치게 된다.


1. filter 

요청과 응답을 거른 뒤 정제하는 역할을 한다.

서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행 할 수 있다.

또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수 있다.

보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS 방어 등의 요청에 대한 처리로 사용된다.

(servlet, jsp뿐만아니라 이미지와 같은 모든 자원의 요청에도 후출 된다.)



2. interceptor

요청에 대한 작업 전후로 가로챈다.

필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.

하지만 인터셉터는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전후로 끼어들기 때문에 스프링 컨텍스트(context, 영역) 내부에서 Conteroller(Hndler)에 관한 요청과 응답에 대해 처리한다.

스프링의 모든 빈 객체에 접근할 수 있다. 로그인 체크, 권한 체크, 프로그램 실행시간 계산, 로그 확인 등의 업무에 사용한다.



3. aop

객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 출이기 위해 종단면 관점에서 바라보고 처리한다.

주로 로깅, 트랜잭션, 에러처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.

interceptor나 filter와 달리 메소드 전후의 지점에서 자유롭게 설정이 가능하다.

interceptor와 filter은 URI를 대상으로 구분해서 처리하지만 aop는 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다.


aop의 advice와 HandelerInterceptor의 가증 큰 차이는 파라미터 차이다.

advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다.

하지만 HandlerInterceptor는 filter와 유사하게 HttpServletRequest, HttpservletResponse를 파라미터로 사용한다.



-----------------------------------


interceptor를 이용하여 로그인 체크하는 기능을 프로젝트에 적용해 봤다.


interceptor 클래스 작성

- preHandler() : 컨트롤러 메서드가 실행되기 전

- postHandler() : 컨트롤러 메서드 실행 직 후 view페이지 렌더링 되기 전

- afterCompletion() - view페이지가 렌더링 되고 난 후

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.springbook.biz.common;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Object obj = session.getAttribute("userId");
        
        if(obj == null) {
            response.sendRedirect("login.do");
            return false;
        }
        
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }
}
cs



presentation-layer.xml 

- mapping 속성은 검사할 특정 페이지를 찾는다.

- exclude-mapping 속성은 검사할 페이지에서 제외시켜 준다.

1
2
3
4
5
6
7
8
9
10
11
<!-- 인터셉터 설정 (로그인 체크) -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/*.do"></mvc:mapping>
        <!-- <mvc:mapping path="/getBoard.do"></mvc:mapping> -->            <!-- 특정페이지만 잡을때 -->
        <mvc:exclude-mapping path="/login.do"></mvc:exclude-mapping>
        <mvc:exclude-mapping path="/getBoardList.do"></mvc:exclude-mapping>
        <mvc:exclude-mapping path="/getBoard.do"></mvc:exclude-mapping>
        <bean class="com.springbook.biz.common.AuthenticationInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>
cs