필터(Filter)란?
모든 자바 클래스는 POJO (프레임 오브 자바 오브젝트) 이다.
그에 비해 서블릿은 not POJO 이다.
서블릿을 상속받는 특수한 형태의 서블릿이 존재하는데
1) 리스너 : 모니터링, 감지 (특정 상황) == 지난 시간 정리했던 내용 참고([WEB] 12. 리스너)
2) 필터 : 모든 특정 요청에 대해 항상 수행되는 서블릿
이 두가지가 있다.
필터는 리스너와 코드가 유사하다.
기본 생성자 + 실행시(init),종료시(destroy) 한번 수행 되는 메서드 + 항상 수행되는 메서드(doFilter)로 이루어져있고,
chain.doFilter()는 다음 필터를 호출한다.
다음 필터가 없으면 원래하던 요청을 수행한다.
필터의 호출 원리
V --(필터)logout.do -->> --(필터)main.do -->> V 순으로 진행되고( .do를 실행하기전(직전) 필터를 거친다 )
.do라는 액션을 취할 때마다 필터를 거치길 원하면
@WebFilter("*.do") 어노테이션 걸어줘야 한다.
권한확인 부여확인
doFilter()에 권한확인 로직을 작성해야한다.
권한이 되지않으면 해당 페이지 못들어가게 코드를 작성해봤다.
<VailedFilter.java>
package controller.common;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("*.do") // 어노테이션 작성 .do할때마다 이 필터를 거칠 수 있도록
public class ValidFilter extends HttpFilter implements Filter {
public ValidFilter() { // 기본생성자
super();
}
public void destroy() {
System.out.println("필터 종료");
}
// http가없는 그냥 servletrequest이다.(모든 요청) == 형변환 필요
// response도 쓸일이 있다면 http로 형변환이 필요하다
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("로그 : 필터가 호출됨");
// 권한확인 로직
/*
if(사용자가 /mypagePage.do 요청을 했니?) {
if(로그인 '안'했니?) {
에러페이지로 보내버리기 == 예외를 발생시키면된다.
}
}
*/
// 사용자가 무슨 요청을 했는지 추출 및 확인
HttpServletRequest httpRequest = (HttpServletRequest)request; // 형변환 == 타입캐스팅
String uri=httpRequest.getRequestURI();
String cp=httpRequest.getContextPath();
String command=uri.substring(cp.length());
if(command.equals("/mypagePage.do")) { // 막을페이지는 많다 // 관리자페이지, 로그아웃(로그아웃상태에서), 결제 등등
if(httpRequest.getSession().getAttribute("loginInfo")==null) {
throw new NullPointerException(); // Exception은 반드시 체크해야되는 check익셉션이다
// (try-catch문 쓰지않기 위해) check안해도되는 nullpoint가져온다
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("필터 시작"); // 서버가 처음 구동될 때 세팅 됨
}
}
여기서 리스너와 필터의 차이점을 표로 정리해 봤다.
| 특징 | 리스너 (Listener) | 필터 (Filter) |
| 목적 | 특정 이벤트 발생 시 이를 감지하고 처리하는 데 사용 | 요청/응답을 가로채서 처리하거나 수정하는 데 사용 |
| 주요 사용처 | GUI 컴포넌트(예: 버튼 클릭), 이벤트 기반 시스템 | 웹 요청/응답 처리, 보안, 로깅, 데이터 변환 등 |
| 처리 위치 | 주로 이벤트 발생 후, 이벤트가 발생한 컴포넌트 내에서 처리 | 요청과 응답 흐름 사이, 웹 서버와 클라이언트 간의 중간 단계에서 처리 |
| 설정 방법 | 이벤트 소스에 리스너를 등록 | 웹 애플리케이션의 web.xml 파일이나 애너테이션으로 필터를 등록 |
| 상황 | 사용자의 클릭, 키 입력 등 GUI 이벤트 처리 | 웹 페이지 요청 전후의 로깅, 인증, 인코딩 처리 |
'WEB' 카테고리의 다른 글
| [WEB] 13. 효율적인 모달창(알람) (1) | 2024.09.04 |
|---|---|
| [WEB] 12. 리스너 (0) | 2024.09.03 |
| [WEB] 11. 비동기 처리 (0) | 2024.08.23 |
| [WEB] 10. 핸들러맵핑과 싱글톤 패턴 (0) | 2024.08.22 |
| [WEB] 09. 스프링 프레임워크의 구조 (0) | 2024.08.20 |