티스토리 뷰
servlet filter...
Filter 사용 이유
인증 되지 않은 사용자가 접근을 시도한다면, 그 접근 자체를 거부해야하는 부분이 필요하다.
이때에, 사용할 수 있는 기술 중 하나가 "Filter"이다
HTTP 요청 흐름 (+ Filter)
HTTP Request Flow
HTTP 요청 -> WAS -> Filter -> Servlet -> Controller
- 인증되지 않는 사용자의 요청을 거부하기 위해서는 Controller 도달 전에 거부를 해야한다 (Filter의 사용 이유)
- Filter의 경우 Chain 기능이 존재 (= 여러개의 Filter를 둘 수 있다)
Servlet Filter 인터페이스
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
- init() : 필터 초기화 메서드 ( 서블릿 컨테이너가 생성될때 사용 )
- doFilter() : 고객의 요청이 올 때 마다 실행됨 (해당 Filter 로직을 사용하여, 필터링 가능)
- destory() : 필터 종료 메서드 ( 서블릿 컨테이너가 종료될 때 호출 )
doFilter() 메서드
HTTP 요청 -> WAS -> Filter #1 -> Filter#2 -> ... -> Servlet -> Controller
- Servlet Filter에서 가장 중요한 메서드
- 해당 메서드를 실행하여, 다음 filter로 이동 시키거나 다음 filter가 없을 경우 서블릿을 호출
- 해당 메서드의 chain 부분을 실행하지 않으면 다음 HTTP Flow를 못넘기고 종료될 수 있음 (주의 요망)
@Slf4j
public class LogTest implements Filter{
@Override
//init()...
@Override
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException{
try{
log.info("REQUEST");
if ( Filter 검열시 ){
return; // .doFilter() 메서드를 이용하지 않고, 바로 반환 ( 요청 종료 )
}
var3.doFilter(var1, var2);
}catch (Exception e){
throw e;
}finally{
log.info("RESPONSE");
}
@Override
//destory()...
}
Servlet Filter 등록 방법
- Component 등록
- 요청 흐름 : HTTP요청 -> WAS -> MethodFilter#1 -> MethodFilter#2 -> Servlet -> Controller
- Component 등록으로 이용시, 스프링의 내정된 규칙에 따라 우선순위가 달라짐
- 이런 부분을 보완하고자, @Order 애노테이션을 이용하여 우선순위를 지명해줌
- @WebFilter(urlPatterns="[URL]") 을 사용하여 적용하고 싶은 Filter 범위를 지정
@Component
@Order(1)
@WebFilter(urlPatterns="/*")
public class MethodFilter#1 implements Filter{
@Override
void doFilter()//..
}
@Component
@Order(2)
@WebFilter(urlPatterns="/*")
public class MethodFilter#2 implements Filter{
@Override
void doFilter()//..
}
- Bean 등록
- .setFilter() 메서드를 이용하여 Filter 클래스를 추가
- .setOrder() 메서드를 이용하여 우선순위 선정
- .setUrlPatterns() 메서드를 이용하여 필터 적용 범위 설정
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean logFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new MethodFilter#1());
filterRegistrationBean.setOrder(new MethodFilter#1());
filterRegistrationBean.setUrlPatterns("/*");
return filterRegistrationBean;
}
}
'백엔드 > SPRING MVC' 카테고리의 다른 글
예외처리 (web page) (0) | 2024.10.07 |
---|---|
Spring Intercept (0) | 2024.10.07 |
Session 사용법 (0) | 2024.10.06 |
Cookie 사용법 (0) | 2024.10.06 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- SQL
- stack
- 티스토리챌린지
- 오블완
- 타입변환
- 버블정렬
- DFS
- 게시판
- 포트폴리오
- Java
- 백준
- 깊이우선탐색
- 게시판 프로젝트
- 정렬
- BFS
- HTML5
- 코딩테스트
- 클래스
- JDBC
- 알고리즘
- bean
- JSON
- 이진탐색
- 우선순위 큐
- 검증
- 기술면접
- Thymeleaf
- 예외처리
- Spring
- db
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함