본문 바로가기
JSP

[JSP] 17. 서블릿 필터와 리스너

글: Song hyun 2024. 7. 3.
728x90
반응형

[JSP] 17. 서블릿 필터와 리스너



1. 서블릿 필터

-필터는 서블릿이나 JSP에 요청이 도달하기 전에, 요청과 응답을 가로채서 처리하는 컴포넌트이다.
-필터는 요청을 수정하거나, 응답을 변경하거나, 로깅 및 인증 등의 작업을 수행할 수 있다.
-필터는 클라이언트와 자원 사이에 여러 개의 필터가 모여 하나의 체인을 형성할 수도 있다.

-WAS 서버에 필터를 설정하는 방법은 (1) web,xml 파일에서 설정하거나 / (2) 어노테이션을 통해 사용할 수 있다.
-Java 코드에서 필터 사용 시, Filter라는 인터페이스를 구현하면 된다.
-Filter->doFilter(doGet/doPost를 생각해보자)
-필터에서 다음 필터체인으로 넘길 때, request/response를 함께 넘긴다.



2. 서블릿 필터의 역할
(1) 요청 및 응답의 전처리 및 후처리
-응답 전/후의 처리를 전처리/후처리라고 한다.

(2) 로깅 처리

(3) 인증 및 권한 부여
*꼭 필터에서만 인증 처리를 하진 않는다! 하지만 할 수도 있다!

(4) 데이터 압축



3. 서블릿 리스너
(1) 서블릿 리스너의 역할
-컨테이너에서 발생하는 이벤트를 모니터링하다가, 특정 이벤트가 발생하면 실행되는 특수한 클래스이다.
-즉 리스너는 특정한 사건이 일어났을 때, 그것을 알아차리고 적절한 처리를 하는 역할!

-WAS 서버에서 리스너를 설정하는 방법은 서블릿과 마찬가지로 web.xml 파일에서 설정하거나, 자바 코드 측에 어노테이션을 사용해 설정할 수 있다.

(2) 리스너의 주요 기능
-애플리케이션 시작 및 종료 감지
-세션 생성 및 소멸 감지
-요청 시작 및 종료 감지
-애플리케이션 속성 변경 감지

 


4. 시나리오 코드

package com.tenco.filters;

import java.io.IOException;

import jakarta.servlet.DispatcherType;
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;

/*
 * 필터 클래스를 만드는 방법
 * 1. jakarta.servlet.Filter를 구현해야 한다. (javax.servlet.Filter <-톰캣 9버전)
 * 2. URL 패턴을 설정해야 한다. (web.xml / 어노테이션 기반 설정 가넝)
 * 
 */

@WebFilter(urlPatterns="/*",dispatcherTypes= {DispatcherType.REQUEST})
public class SimpleFilter implements Filter{

// 필터가 생성될 때 초기화 작업을 수행하는 메서드!
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필요하다면 초기화 코드 작성
System.out.println("SimpleFilter 초기화");
}


// 특정 URL 요청이 들어올 때 실행 또는 통과되는 메서드!
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("SimpleFilter doFilter() 메서드 호출됨.");
}

@Override
public void destroy() {
System.out.println("종료될 때 호출되는 메서드");
}

}


-----------------------

package com.tenco.controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/home")
public class HomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
       

    public HomeServlet() {
        super();
    }

    // 주소 설계 - http://localhost:8080/fl/home
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HomeServlet doGet() 메서드 호출");
}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

}

 



위에서는 필터에서 두겟으로 못넘어감.

----------
----------

package com.tenco.filters;

import java.io.IOException;

import jakarta.servlet.DispatcherType;
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;

/*
 * 필터 클래스를 만드는 방법
 * 1. jakarta.servlet.Filter를 구현해야 한다. (javax.servlet.Filter <-톰캣 9버전)
 * 2. URL 패턴을 설정해야 한다. (web.xml / 어노테이션 기반 설정 가넝)
 * 
 */

@WebFilter(urlPatterns="/*",dispatcherTypes= {DispatcherType.REQUEST})
public class SimpleFilter implements Filter{

// 필터가 생성될 때 초기화 작업을 수행하는 메서드!
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필요하다면 초기화 코드 작성
System.out.println("SimpleFilter 초기화");
}


// 특정 URL 요청이 들어올 때 실행 또는 통과되는 메서드!
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("SimpleFilter doFilter() 메서드 호출됨.");
// 다음 필터로 또는 서블릿으로 요청/응답 객체를 전달!
chain.doFilter(request,response);
}

@Override
public void destroy() {
System.out.println("종료될 때 호출되는 메서드");
}

}
728x90
반응형