[Servlet] Filter와 @WebFilter 어노테이션

소이뎁·2023년 11월 29일
1

Servlet

목록 보기
10/13
post-thumbnail

📍 Filter

  • javax.servlet.Filter 인터페이스를 구현한 클래스이다.
  • 요청과 응답을 동적으로 가로채서 요청이나 응답에 포함된 정보를 변환하거나 사용한다.
  • 주로 요청/응답 변형, 인증 및 권한 부여, 로깅 및 감시를 목적으로 사용한다.

이미지 출처

📍 web.xml 파일의 Filter 매핑 코드 흐름

  • 1️⃣ request 전송
  • 2️⃣ <url-pattern>/*이므로 모든 request URL과 매핑
  • 3️⃣ 매핑된 <filter-name>CharacterEncodingFilter임을 확인
  • 4️⃣ <filter> > <filter-name>CharacterEncodingFilter인 것을 탐색
  • 5️⃣ 연결된 <filter-class>com.test.filter.CharacterEncodingFilter임을 확인 후 해당 필터 실행
  • 매핑되는 Filter가 여러 개라면, web.xml 파일에 작성된 순서대로 적용된다.
<!-- 🔵 src/main/webapp/WEB-INF/web.xml -->

<?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" id="WebApp_ID" version="4.0">
	<display-name>Test</display-name>
	
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name> <!-- 4️⃣ -->
		<filter-class>com.test.filter.CharacterEncodingFilter</filter-class> <!-- 5️⃣ -->
	</filter>
	
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name> <!-- 3️⃣ -->
		<url-pattern>/*</url-pattern> <!-- 2️⃣ -->
	</filter-mapping>
</web-app>
// 🟢 src/main/java/com/test/filter/CharacterEncodingFilter.java

package com.test.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 CharacterEncodingFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		// 필터를 통과할 때 인코딩 설정
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		chain.doFilter(request, response);
	}

}
  • CharacterEncodingFilter(위 코드)에서는 request/response 시, 인코딩을 utf-8로 설정한다.
  • 따라서 Servlet에서 작성했던 인코딩 설정 코드를 생략할 수 있다.
// 🟢 src/main/java/com/test/lesson01/PostMethodEx05.java

package com.test.lesson01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/lesson01/ex05")
public class PostMethodEx05 extends HttpServlet {

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
//		request.setCharacterEncoding("utf-8"); // ⭐️ 생략
//		response.setCharacterEncoding("utf-8"); // ⭐️ 생략
		response.setContentType("text/plain");
		
		String data = request.getParameter("data");
		
		PrintWriter out = response.getWriter();
		out.println("Servlet 실행");
		out.print(data);
	}
	
}

아래에서 POST 요청으로 전송한 "안녕하세요"라는 한글이 utf-8로 인코딩되어 깨지지 않고 출력된 것을 확인할 수 있다.

📍 @WebFilter 어노테이션으로 Filter 매핑 코드 대체하기

  • 매핑하려는 Filter에 @WebFilter("매핑 주소") 어노테이션을 추가한다.
  • web.xml 파일에 Filter 매핑 코드를 작성하지 않아도 된다.
  • @WebFilter 어노테이션은 Filter가 여러 개일 경우 적용 순서를 제어할 수 없다.
// 🟢 src/main/java/com/test/filter/CharacterEncodingFilter.java

package com.test.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("/*") // ⭐️ 어노테이션 추가
public class CharacterEncodingFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		// 필터를 통과할 때 인코딩 설정
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		chain.doFilter(request, response);
	}

}

References

🔗 https://www.oracle.com/java/technologies/filters.html
🔗 https://docs.oracle.com/cd/A97329_03/web.902/a95878/filters.htm

0개의 댓글