- javax.servlet.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
로 인코딩되어 깨지지 않고 출력된 것을 확인할 수 있다.
- 매핑하려는 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);
}
}
🔗 https://www.oracle.com/java/technologies/filters.html
🔗 https://docs.oracle.com/cd/A97329_03/web.902/a95878/filters.htm