Spring boot 기준 Filter는 Spring 외부에 있지 않다.
톰캣이 내장되어 Filter도 Di가 가능.
interceptor는 dispatcher servlet과 controller 사이에서 요청과 응답을 가공, 처리하고자 할 때 사용한다.
interceptor와 filter
filter는 모든 요청과 공통기능에 적용할 사항
interceptor는 선별한 요청과 응답에 대해 적용할 세부 사항
interceptor 와 AOP
interceptor는 URL을 통해 적용할 메서드를 선별
AOP는 포인트컷을 통해 적용할 메서드를 선별
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Login {
}
메서드에서 사용할 Login 어노테이션
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
if (hm.hasMethodAnnotation(Login.class)){
log.info("true");
return true;
}
}
log.info("false");
return false;
}
LoginInterceptor
인터셉터의 preHandle에서 URL 매핑 메서드에 Login어노테이션이 있는지 확인한다.
return true이면 controller로 진입하여 로직을 처리한다.
return false이면 controller로 진입하지 못한다.
HandlerInterceptor의 메서드
preHandler() - 컨트롤러 로직 처리 전
postHandler() - 컨트롤러 로직 처리 후
afterCompletion() - 뷰가 렌더링된 이후에 호출된다.
예외가 발생하면 postHandler()는 동작하지 않지만, afterCompletion()은 동작한다.
Object handler
URL 로 접근하는 매핑된 메서드
HandlerMethod로 형변환하여 매핑 메서드 정보를 읽어낼 수 있다.
@Configuration
public class WebMvc implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
}
작성한 LoginInterceptor 인터셉터를 WebMvcConfigurer 에 등록한다.
WebMvcConfigurer는 어플리케이션 구동시 실행된다.
@Slf4j
@Configuration
public class WebMvc implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")// 적용할 url 패턴
.excludePathPatterns("/ic/get2") // 배제할 url 패턴
.order(1);
}
}
인터셉터를 적용할 URL 패턴을 적용하고, 제외할 수 있다.
인터셉터의 적용 순서도 적용할 수 있다.
URL pattern
/** [ /모든 경로 ]
ex) user/board/1
/* [ /경로 하나 ]
ex) /ic , /user, /board
@Controller
@RequestMapping("/ic")
public class Icontroller {
@GetMapping("/get")
@ResponseBody
@Login
public String test(){
return "hello interceptor";
}
}
Login체크를 진행할 컨트롤러 메서드에 @Login을 붙여준다.
interceptor를 이용한 로직은 목적에 따라 달라질 수 있다.
이전에는 Filter가 스프링 컨테이너에 등록되지 않아, Filter에서 DI를 이용하는 것이 불가능 했다.
(Spring boot 기준) Filter 구현체를 Bean으로 등록하므로, 현재는 가능하다.
@Component
@RequiredArgsConstructor
public class FirstFilter implements Filter {
private final FilterDiTestService filterDiTestService;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("필터 동작");
filterDiTestService.test();
chain.doFilter(request,response);
}
}
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] REST API (0) | 2022.08.26 |
---|---|
[Spring] 스프링 Resources 파일 읽기, 복사 (0) | 2022.08.12 |
[Spring] server to server, REST API 서버 요청 (0) | 2022.08.11 |
스프링 프레임워크 DI, AOP, 환경설정(intellij, gradle, tomcat) (0) | 2022.07.23 |
[Spring] Bean을 싱글톤으로 사용해도 되는 이유 (0) | 2022.07.18 |