JSP -서블릿 필터-

이인호·2025년 8월 29일
0

JSP

목록 보기
3/3

필터란?

클라이언트의 요청(Request)와 서버의 응답(Response)에 대해 전/후처리 하는 컴포넌트
서블릿보다 먼저 실행되어 요청 흐름에 개입 가능

필터를 적용하면
-> 자원이 받게 되는 요청 정보는 클라이언트와 자원 사이에 존재하는 필터에 의해 변경된 요청정보가 되며, 클라이언트가 보게 되는 응답 정보는 클라이언트와 자원사이에 존재하는 필터에 의해 변경된 응답정보가 된다.

기본적인 필터 적용 방식


package Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

//@WebFilter("/index.do")	-> java EE tools에 있는 Descriptor stub으로 매핑해되 됨

public class HomeFilter_1 implements Filter{	
	
    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {
    	// FilterChain 객체는 다음 실행 단계를 연결해주는 역할을 함
        
        // Request Servlet으로 전달되기 전 코드
        System.out.println("[FILTER] Home Filter_1 Start);
        
        chain.doFilter(req,resp); 	// 다음 실행 단계로 이동시켜줌
        							// 필터가 있다면 그 필터를, 없다면 최종적으로 servlet 실행
        
        // Response가 Client로 전달되기 전 코드
        
        System.out.println("[FILTER] Home Filter_2 ENd);
 	}
}

포인트

  • doFIlter()내에서 chain.doFilter()를 호출하지 않으면 요청 흐름이 중단
  • 등록 순서에 따라 실행 순서 결정
  • 인코딩처리(모든 요청에 UTF-8적용), 보안 검사, 접근 제어 등등에 쓸 수 있다

인코딩처리 해보기

인코딩처리하는 필터 만들기
서블릿 파일

package Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class UTF8_EncodingFilter implements Filter{

	@Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    
    	req.setCharcterEncoding("UTF-8");		// 요청시 문자열 인코딩
        // System.out.println("[FILTER] UTF8 FILTER Start");
        
        chain.doFilter(req, resp);
        
        resp.setContentType("text/html; charset = UTF-8");
        System.out.println("[FILTER] UTF8 FILTER End");
  	}
}

jsp파일

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>03_FILTER</display-name>
  <welcome-file-list>
  	<!-- <welcome-file>/WEB-INF/index.jsp</welcome-file> -->
  	
  	<welcome-file>index.do</welcome-file>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.xhtml</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.xhtml</welcome-file>
  </welcome-file-list>
  
   <!-- 서블릿 등록 -->
   <servlet>
   	<servlet-name>Home</servlet-name>
    <servlet-class>Servlet.Home<servlet-class>
   </servlet>
   <servlet-mapping>
   	<servlet-name>Home<servlet-name>
    <url-patter>/index.do</url-pattern>
   </servlet-mapping>
   
  <!-- 필터 등록 -->
  <filter>
  	<filter-name>UTF8_EncodingFilter</filter-name>
    <filter-class>Filter.UTF8_EncodingFilter</filter-class>	
  </filter>
  <filter-mapping>
  	<filter-name>UTF8_EncodingFilter</filter-name>
    <url-pattern>*.do</url.pattern> 	<!-- 확장자를 do로 가지는 모든 파일 -->
  </filter-mapping>
  
    <filter>
  	<filter-name>HomeFilter_1</filter-name>
  	<filter-class>Filter.HomeFilter_1</filter-class>	
  </filter>
  <filter-mapping>
  	<filter-name>HomeFilter_1</filter-name>
  	<url-pattern>/index.do</url-pattern>
  </filter-mapping>
  
</web-app>

관련 클래스 & 메서드

  1. Filter 인터페이스의 주요 메서드

init

  • 필터 초기화 시 한 번 실행
  • DB 연결 준비, 설정 값 로딩 등에 사용

doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

  • 실제로 요청/응답을 가로채는 핵심 메서드
  • 전처리 -> chain.doFilter() -> 후처리 구조

destroy()

  • 서버 종료 시 호출
  • 리소스 해제
  1. ServletRequest/ ServletResponse 자주 쓰는 메서드

🔹ServletRequest(요청 관련)
-setCharcterEncoding("UTF-8") -> 요청 데이터 인코딩 지정
-getParameter("name") -> 클라이언트에서 보낸 파라미터 값 가져오기

  • getParameterValues("checkbox") -> 여러 값 가져오기
  • getAttribute("key") / setAtrribute("key", value) -> 요청 범위에 데이터 저장\
  • getRemoteAddr() -> 클라이언트 IP
  • getRequestDispatcher("/page.jsp").forward(req, resp) -> 포워딩

🔹ServletResponse(응답 관련)
-setContetType("text/html; charset = UTF-8") -> 응답 콘텐츠 타입 설정
-getWriter() -> 텍스트 응답 출력 스트림
-getOutputStream() -> 바이너리 응답 출력 스트림

  1. FliterChain 자주쓰는 메서드
    doFilter(req, resp)
  • 필수 호출
  • 다음 필터나 최종 서블릿으로 요청 전달
  • 호출 안하면 요청 끊김
profile
아프지말고 평생 놀고 싶다

0개의 댓글