Spring/Maven Project

Spring에 Filter 적용 (javax.servlet.Filter)

carrotweb 2022. 9. 11. 17:39
728x90
반응형

Filter (필터 - javax.servlet.Filter)

Filter(필터)는 웹 브라우저(Web Browser)에서 Servlet에 Request(요청) 하기 전이나 Servlet에서 웹 브라우저로 Response(응답) 하기 전에 필터링(별도의 작업을 처리)합니다. 그래서 Filter(필터)는 Servlet 보다 먼저 처리됩니다. 이것을 서블릿 필터(Servlet Filter)하고 합니다.

 

Filter(필터)는 Request(요청)과 Response(응답) 사이에서 처리됩니다.

Web Browser  → Filter1  → Servlet  → Filter1 → Web Browser

 

Filter(필터)는 여러 개를 설정할 수 있고 설정 순서에 따라 처리 순서가 정해집니다. 이것을 FilterChain(필터체인)이라고 합니다.
Web Browser → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → Web Browser

 

Filter Life Cycle(필터 생명주기)는 간단하게 설명하면
init(최초 한번 실행) → doFilter → destory(WAS 종료 전 처리) 순으로 이루어집니다.

 

doFilter에서는 chain.doFilter(request, response)를 통해 다음 Filter(필터)가 있으면 전달하고 없으면 Servlet에 전달합니다. 그래서 chain.doFilter(request, response)를 기준으로 전에 처리(Filter → Servlet)하고 후에 처리(Servlet  Filter)하면 됩니다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	// 전처리 작업

	// pass the request along the filter chain
	chain.doFilter(request, response);
	
	// 후처리 작업
}

 

 

Maven Spring Project에 UTF-8 Encoding Filter 적용하기

 

1. WEB-INF/web.xml 파일을 클릭하여 오픈하고 <web-app>의 <servlet> 위에 <filter>로 UTF-8 인코딩을 추가합니다.

 

  1. 필터의 이름을 입력하고 클래스를 Spring Framework의 문자 인코딩 필터인 org.springframework.web.filter.CharacterEncodingFilter를 입력합니다.
  2. Request(요청)에 전송되는 문자열을 UTF-8로 인코딩하기 위해 <init-param>의 name을 "encoding"으로 하고 value을 "utf-8"로 입력합니다.
  3. Response(응답)에 전송되는 문자열을 UTF-8로 인코딩하기 위해 <init-param>의 name을 "forceEncoding"으로 하고 value을 "utf-8"로 입력합니다.
  4. <filter-mapping>에서 요청 URL 전체가 적용되게 "/*"로 입력합니다.
<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

 

 

Maven Spring Project에 Filter Dispatcher 설정

 

Filter(필터)는 다음과 같은 요청에 대해 필터링을 할 수 있습니다.

  • 웹 브라우저(Web Browser)가 서버로 Request(요청)할 때
  • Servlet에서 RequestDispatcher로 include()나 forward()로 Request(요청)할 때
  • Servlet에서 예외 발생으로 에러 페이지를 Request(요청)할 때

 

Filter(필터)는 <filter-mapping>에 <dispatcher> 태그를 사용하여 Request(요청)할 때(REQUEST), RequestDispatcher로 include()할 때(INCLUDE), forward()로 Request(요청)할 때(FORWARD), 에러 페이지를 Request(요청)할 때(ERROR)를 구분하여 설정할 수 있습니다. <filter-mapping>에서 <dispatcher> 태그를 설정하지 않으면 기본적으로 REQUEST가 적용됩니다.

<filter-mapping>
	<filter-name>anyFilter</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>INCLUDE</dispatcher>
	<dispatcher>FORWARD</dispatcher>
	<dispatcher>ERROR</dispatcher>
</filter-mapping>

 

이제 컨트롤에서 request.setCharacterEncoding("UTF-8");과 response.setCharacterEncoding("UTF-8");를 사용하지 않아도 자동으로 문자열이 UTF-8로 인코딩 되게 되었습니다.

 

728x90
반응형