본문 바로가기
JAVA/JAVA 기본

인터셉터란? JSP Filter와의 비교, url-pattern

by F.E.D 2018. 5. 14.

인터셉터란?


인터셉터는 간단히 말해서 특정 URI로 요청시 Controller로 가는 요청을 가로채는 역할을 합니다.
이전에 포스팅한 ExpirationDate도 이러한 인터셉터로 사용합니다. URI로 가는 요청을 가로채어 Date를 체크해주는 역할인 것입니다.

JSP Filter는 아래에서 다룰텐데요.
둘 다 Controller로 들어가는 요청을 가로채어 특정 작업을 하기 위한 용도로 사용됩니다.

차이점은 영역 범위가 다르다는 것입니다. Filter는 같은 웹 어플리케이션 내에서만 접근이 가능합니다. 
하지만 인터셉트의 경우에는 스프링에서 관리되는 부분이기 때문에 스프링 내에 모든 객체로 접근이 허용됩니다.

또한, Filter의 경우는 주로 한글처리에 이용하며 Interceptor는 로그인 처리에 이용이 됩니다.

왜 그럴까요?

인터셉터가 없다면 로그인 처리 할 때 각각의 게시물 작성, 수정, 삭제 등 모든 요청이 있을 때마다 session을 통해 로그인 정보를 확인하는 코드를 입력해야 합니다.
하지만, 인터셉터만 있다면 중간에 가로채어(Intercept) 먼저 수행하는 것이 가능해지기 때문에 session에서 일일이 로그인 정보가 있는지 확인하는 선언을 여기다가 부여하면 한번으로 모든 범위를 커버할 수 있기 때문입니다.

그러면 이제 인터셉터를 지원하는 인터페이스와 클래스 그리고 메서드를 알아봅시다.

인터셉터를 지원하는 인터페이스

HandlerInterceptor 인터페이스

인터셉터를 지원하는 추상 클래스

HandlerInterceptorAdaptor 추상 클래스 

HandlerInterceptorAdaptor가 지원하는 3가지 메서드

오버라이딩으로 이용할 수 있는 3가지 메서드가 있습니다.

1. public boolean preHandle(HttpServletRequest, HttpServletResponse response, Object handler)
  - Controller로 요청이 들어가기 전에 수행됩니다.
  - request, response, handler 등의 매개변수를 이용가능한데 우리가 아는 HttpServletRequest, HttpServletResponse와 나머지 하나는 preHandle() 메서드를 수행하게 될 컨트롤러 메서드에 대한 정보를 담고있는 handle 입니다.

2. postHandle(HttpServletRequest request, HttpServletResponse, Object handler, ModelAndView modelAndView)
   - 컨트롤러의 메서드의 처리가 끝나 return 되고 화면을 띄워주는 처리가 되기 직전에 이 메서드가 수행됩니다.
   - ModelAndView 객체에 컨트롤러에서 전달해 온 Model 객체가 전달됩니다. 컨트롤러에서 작업 후 
     postHandle() 에서 작업할 것이 있다면 ModelAndView를 이용합니다.

3. afterCompletion() : 컨트롤러가 실행되고 난 뒤 View까지 실행되고 나면 호출됩니다.


아래의 필터와 함께 구분지어 볼 수 있겠는데요. 

JSP Filter

Client와 서버 사이에 필터가 존재하는 것이며, 들어오는 request와 response를 필터가 먼저 받고 이 작업을 사전, 사후로 나누어 공통적으로 수행되는 부분을 수행합니다.

예를 들면 한글 인코딩의 경우 필터에 넣어두면 항상 인코딩 해줄 수 있다고 합니다.

그냥 사용은 안되고 web.xml에 filter를 등록하고 사용합니다.

Filter 소스

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
30
31
32
33
34
package 패키지경로;
 
import java.io.IOException; // input output exception
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
public class Filtering implements Filter { // implements(구현) 하는 클래스를 만들어줍니다.
 
    @Override
    public void jobFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 모든 요청에 의해서 이부분이 실행됩니다.
        HttpServletRequest request = (HttpServletRequest)req;       
  
        System.out.println("RequestURL : "+request.getRequestURL());        
 
        chain.jobFilter(req, res);
    }
 
    @Override
    public void init(FilterConfig config) throws ServletException { //필터를 초기화 합니다.
 
        String filterParam = config.getInitParameter("testParam");        
 
        System.out.println("filterParam: " + filterParam); 
    }
    
 
}
 
cs



web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<filter>
    <filter-name>Filtering</filter-name>
    <filter-class>
        package경로.Filtering
    </filter-class>
    <init-param>
        <param-name>filterParam</param-name>
        <param-value>this is parameter</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>jobFilter</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>
</web-app>
 
 
cs



여기에서 짚고 넘어가야할 url-pattern에 궁금증이 생겨서 알아보았습니다.


url-pattern /와 /*의 차이

url-pattern은 Rest style Url이 유행하면서 직면하는 문제를 해결해줍니다. 
*.do와 같은 확장자를 가지면 촌스럽기 때문이죠 ㅎㅎ
하지만 /*로는 Controller mapping url을 호출하면 404에러가 발생하면서 아래와 같은 로그가 찍힙니다.


1
2
No mapping found for HTTP request with URI [/WEB-INF/view/common/layout/default/layout.jsp] in 
DispatcherServlet with name 'dispatcher'
cs

/* 방식은 다음과 같은 특징들을 가지고 있습니다.

1. "/"로 시작하고 "/*"로 끝나는 패턴은 path로 인식합니다. 
2. "*."으로 시작하는 경우 확장자 매칭"/"만 정의한 경우 디폴트 서블릿의 의미
3. 그 외의 경우 동치 매칭 됩니다.

따라서 위와같은 오류가 발생하는 것입니다.

해결 방안은 url-pattern을 "/" 로만 지정하면 된다는 것입니다.
 "/"로 정의한 경우 디폴트 서블릿을 의미합니다.






출처

http://rongscodinghistory.tistory.com/2

http://programmingsummaries.tistory.com/82

http://nine01223.tistory.com/238

'JAVA > JAVA 기본' 카테고리의 다른 글

[참조] 숫자 순으로 나열된 HTML ASCII 문자  (0) 2018.05.31
Java에서 HashMap 사용하기  (0) 2018.05.24
[자료구조] 큐(Queue)  (0) 2018.04.15
REST의 기본  (2) 2018.04.15
Bean Scope & Singleton  (0) 2018.04.12

댓글