클라이언트의 요청(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()
를 호출하지 않으면 요청 흐름이 중단인코딩처리하는 필터 만들기
서블릿 파일
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>
init
doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
chain.doFilter()
-> 후처리 구조destroy()
🔹ServletRequest
(요청 관련)
-setCharcterEncoding("UTF-8")
-> 요청 데이터 인코딩 지정
-getParameter("name")
-> 클라이언트에서 보낸 파라미터 값 가져오기
getParameterValues("checkbox")
-> 여러 값 가져오기getAttribute("key") / setAtrribute("key", value)
-> 요청 범위에 데이터 저장\getRemoteAddr()
-> 클라이언트 IPgetRequestDispatcher("/page.jsp").forward(req, resp)
-> 포워딩🔹ServletResponse
(응답 관련)
-setContetType("text/html; charset = UTF-8")
-> 응답 콘텐츠 타입 설정
-getWriter()
-> 텍스트 응답 출력 스트림
-getOutputStream()
-> 바이너리 응답 출력 스트림
doFilter(req, resp)