320x100
반응형
서블릿 필터
필터내에서 특정 조건을 만족하지 못한다면 해당 필터에서 끝을 내고 컨트롤러를 호출하지 않도록 제어하는 역할이다
체인 형식으로 여러개의 필터를 순차적으로 등록하여 사용할수 있다
로그인관련에서 사용
흐름
Http 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 호출
Interface
Filter인터페이스를 상속받아서 구현을 한다
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//초기화시 호출
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//필터 로직 구현
}
@Override
public void destroy() {
//필터 종료시 호출
}
}
등록방법
- @Component: filter객체를 컴포넌트스캔 대상으로 지정, 적용범위는 전체 URL을 대상으로 하므로 특정 URL에만 적용을 하기 위해서는 Bean으로 등록을 해서 사용을 해야한다
- @Bean등록
@Bean public FilterRegistrationBean filterRegister(){ FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>(); filterFilterRegistrationBean.setFilter(new LoginCheckFilter()); filterFilterRegistrationBean.setOrder(1); filterFilterRegistrationBean.addUrlPatterns("/members"); return filterFilterRegistrationBean; }
인터셉터
필터와 같은 역할을 하지만 호출 시점과 호출시점별로 단계적으로 세분화 되어있다
인터페이스에 default메소드로 등록이 되어있기 때문에 filter와 같이 모든 메서드를 재정의 해줄 필요없이 원하는 것만 구현을 해주면 된다
public interface HandlerInterceptor {
//컨트롤러 객체 호출 전
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
//컨트롤러 정상적으로 실행된 이후
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
//뷰가 렌더링 된 이후
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
- preHandle(): return값 true - 다음으로진행, false - 끝
- postHandle(): 컨트롤러에서 예외 발생시 호출x
- afterCompletion(): 예외 발생해도 항상 호출
흐름
Http 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 호출
등록방법
java기반
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] totalExcludePath = {"/css/**", "/*.ico", "error"};
String[] loginExcludePath = {"/", "/members/add", "/login", "/logout", "/css/**", "/*.ico", "/error"};
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns(totalExcludePath);
registry.addInterceptor(new LoginCheckInterceptor())
.order(2)
.addPathPatterns("/**")
.excludePathPatterns(loginExcludePath);
}
}
xml기반
<mvc:interceptors>
<!-- 요청 경로 패턴 지정 -->
<mvc:interceptor>
<mvc:mapping path="/login">
<mvc:mapping path="/logout">
...
<mvc:mapping path="/">
<bean class="경로">
</mvc:interceptor>
<!-- 전체 경로에 대해서 지정 -->
<bean class="경로">
</mvc:interceptors>
참고
인프런_스프링 MVC 2편 - 백엔드 웹개발 핵심 기술_김영한 님 강의
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
320x100
반응형
'공부기록 > Spring' 카테고리의 다른 글
DTO관련 고민 (0) | 2022.07.13 |
---|---|
Spring - 예외처리 (0) | 2022.02.06 |
Spring - 로그인 처리 세션쿠키 (0) | 2022.01.28 |
Spring-MVC4 에러검증2 (0) | 2022.01.22 |
Spring MVC3 - Error검증 (0) | 2022.01.17 |