본문으로 바로가기


인터셉터(Interceptor)

- Dispatcher Servlet에서 Handler(Controller)로 요청을 보낼때, Handler에서 Dispatcher Servlet으로 응답을 보낼때 동작함

- HandlerInterceptor는 컨트롤러 실행 전・후에 공통적으로 해야하는 작업을 처리해줌


Spring의 controller 호출 전에 동작하는 방식으로써 보통은 로그인 체크유무가 필요한 곳에서 사용한다

예를 들어, 게시판의 글쓰기 페이지에서 아무런 동작을 하지 않으면, 세션이 제거되어 아이디 정보가 증발하게 된다

이 때, 글을 작성하게 되면 아이디 컬럼이 들어가지 않게 된다

또는, 마이페이지의 메뉴 혹은 브라우저에 남아있는 URL로 접근을 할 경우에도 세션이 존재하지 않으면 접근을 막아야한다


예전에는 스크립트로 체크를 하거나 if문으로 처리를 했지만,

인터셉터 설정은 모든페이지에 적용을 해주지 않아도 되며, xml설정과 class파일 하나를 추가하여 해결 할 수 있다




Intercepter 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package kr.or.connect.guestbook.interceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
public class LogInterceptor extends HandlerInterceptorAdapter {
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println(handler.toString() + "가 종료되었습니다. " + modelAndView.getViewName() + "을 view로 사용합니다.");
    }
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println(handler.toString() + "를 호출했습니다.");
        return true;
    }
}
cs


Interceptor 등록

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
46
47
48
49
50
51
52
53
54
package kr.or.connect.guestbook.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
 
import kr.or.connect.guestbook.interceptor.LogInterceptor;
 
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.or.connect.guestbook.controller"})
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
    // ~이러한 요청이 들어오면 ~폴더에서 읽어오도록 처리해라
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
        registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
        registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
    }
    // Default servlet handler를 사용하게함 
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
   
    // '/'로 요청이 들어오면 처리해라
    @Override
    public void addViewControllers(final ViewControllerRegistry registry) {
            System.out.println("addViewControllers가 호출됩니다. ");
        registry.addViewController("/").setViewName("index");
    }
    
    // 맵핑정보가 없는 요청이 왔을때 이렇게 처리해라
    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
    
    // 인터셉터 등록
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor());
    }
}
cs


결과

1
2
3
4
5
6
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.list(int,org.springframework.ui.ModelMap,java.lang.String,javax.servlet.http.HttpServletResponse)가 종료되었습니다. list을 view로 사용합니다.
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.write(kr.or.connect.guestbook.dto.Guestbook,javax.servlet.http.HttpServletRequest)를 호출했습니다.
clientIp : 0:0:0:0:0:0:0:1
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.write(kr.or.connect.guestbook.dto.Guestbook,javax.servlet.http.HttpServletRequest)가 종료되었습니다. redirect:list을 view로 사용합니다.
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.list(int,org.springframework.ui.ModelMap,java.lang.String,javax.servlet.http.HttpServletResponse)를 호출했습니다.
public java.lang.String kr.or.connect.guestbook.controller.GuestbookController.list(int,org.springframework.ui.ModelMap,java.lang.String,javax.servlet.http.HttpServletResponse)가 종료되었습니다. list을 view로 사용합니다.
cs



아규먼트 리졸버(Argument Resolver)

- 컨트롤러의 메소드의 인자로 사용자가 임의의 값을 전달하는 방법을 제공하고자 할 때 사용함

- 예를 들어, 세션에 저장되어 있는 값 중, 특정 이름의 값을 메소드 인자로 전달함



'Dev > JSP' 카테고리의 다른 글

[JSP] Spring Cookie & Session  (0) 2018.10.10
[JSP] Spring MVC  (0) 2018.07.20
[JSP] Spring JDBC  (0) 2018.07.20
[JSP] Spring  (0) 2018.07.19
[JSP] JDBC 사용하기!!  (0) 2018.05.29