은은하게 코드 뿌시기

[Spring] Interceptor/ 인터셉터와 필터의 차이 본문

웹/spring

[Spring] Interceptor/ 인터셉터와 필터의 차이

은은하게미친자 2022. 8. 24. 14:15
728x90

인터셉터 (Interceptor)

: 컨트롤러에 드러오는 요청 HttpRequest와 컨트롤라가 응답하는 HttpResponse를 가로채는 역할

EX) 관리자 페이지 접근전 관리자 인증으로 활용 ,AuthenticationInterceptor

 

인터셉터와 필터의 차이?

  Filter Interceptor
호출시점 Dispatcer Servlet 이 실행 되기전 DispatcherServlet 이 실행 된후
설정위치 web.xml spring/servlet-context.xml 
구현방식 web.xml에서 설정으로만 구현가능 servlet-context.xml  설정 및 구현 필요

 

인터셉터 메소드

  • preHandle 메소드  :  컨트롤러가 요청을 처리하기전에 호출하는 메소드
  • postHandle 메소드  : 컨트롤러가 요청을 처리한 예외가 발생하지 않은 경우에  호출하는메소드
  • afterCompletion 메소드 :  컨트롤러가 요청을 처리한후예외 발생 여부 상관없이 호출되는 메소드

Filter와 인터셉터의 차이와

적용 예를 예제로 알아보쟈!

 

Filter 적용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   <!-- 필터 정의 -->
   <filter>
      <filter-name>EncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter
      </filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
   </filter>
 
   <!-- 필터 맵핑 /* 는 모든 경로의 파일을 말한다. -->
   <filter-mapping>
      <filter-name>EncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
cs

 

Interceptor 적용예제

 

servlet-context.xml

1
2
3
4
5
6
7
8
9
10
11
12
    <!-- 인터셉터 설정 -->
    <beans:bean class="kr.co.dong.commom.AuthenticationInterceptor" id="auth"/>
    <!-- 인터셉터를 위한 맵핑경로 -->
    <interceptors>
        <interceptor>
            <mapping path="/board/register"/>        
            <mapping path="/board/detail"/>        
            <mapping path="/board/update"/>    
            <mapping path="/board/delete"/>    
            <beans:ref bean="auth"/>
        </interceptor>
    </interceptors>
cs

 

class  AuthenticationInterceptor

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
35
36
37
38
39
40
41
42
43
44
45
package kr.co.dong.commom;
 
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 {
 
    //Controller 가 요청을 처리하기전에 호출하는 메소드
    @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// 로그인 되어있으면 통과 pass~
    }
 
    //Controller 가 요청한 처리한 후에 호출하는 메소드
    // 예외가 발생되지 않은 경우에만 Controller 작업 후에 호출되는 메소드
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        
    }
 
    //Controller 가 요청한 처리한 후에 호출하는 메소드
    // 예외 발생 여부에 상관없이 Controller 작업 후에 호출되는 메소드
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        
    }
 
}
 
cs

로그인 인터셉터에서 알람 띄우기.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //지정한 컨트롤러에 들어가기전에 세션이 없으면 로그인화면으로
        
        HttpSession session = request.getSession();
        response.setCharacterEncoding("UTF-8");
        
        if (session.getAttribute("user_id")==null) {
            PrintWriter prtw = response.getWriter();
            
            response.setContentType("text/html; charset=UTF-8");
            
            prtw.print("<script>alert('로그인해주세요.');"
                    + " location.href='"
                    + request.getContextPath() + "/login"
                    + "'; </script>");
            prtw.flush();
            prtw.close();
 
            return false;
        }
        return true;
    }
cs

 

 

728x90
Comments