티스토리 뷰

Servlet JSP

서블릿 필터 Servlet Filter

Programmers 2021. 4. 22. 17:18
반응형

서블릿 필터 Servlet Filter 란?

그림을 보고 이해해보자!


WAS(우리가 사용하는 Tomcat)에서 Servlet(*. java)를 Request 할 때 Reponse 할 때 이 Filter를 통과해야 한다.
이 필터가 있음으로써 WAS에서 설정을 변경하지 않고도 모든 서블릿에 영향을 준다.
Servlet Filter는 값을 전달하는 역할도 하고, 접근권한, 인증까지도 설정할 수 있다.

이제 Servlet Filter를 설정하는 두 가지의 방법에 대해서 알아보자!
이번 예제는 Servlet Filter를 통해서 모든 Servlet의 URI인코딩 방식을 UTF-8로 변환하는 것이다.

1번째 방법.
직접 Web.xml코드를 수정해서 만드는 방법이다.
가장 먼저 Noticereg.java에서 인코딩했던 부분을 주석처리해준다. 그래야 여기서 필터 적용이 확인이 되겠지?

package com.newlecture.web;

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

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

@WebServlet("/notice-reg")
public class Noticereg extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		//request.setCharacterEncoding("UTF-8");
		
		PrintWriter out = response.getWriter();
		
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		
		out.println(title);
		out.println(content);
		}
	
	}
	

filter Class생성

먼저 새로운 class를 생성하고, 위의 사진처럼 interface도 추가해준다.
그리고 CharacterEncodingFilter.java 파일을 열고 코드를 수정해주자!

package com.newlecture.web.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 {
		
		System.out.println("Hello, Servlet Filter");
	
	}

}

System.out.println("Hello, Servlet Filter"); 코드를 추가하고~
이번 방법에서는 web.xml파일에서도 서블릿 필터를 사용할 수 있도록 코드를 추가해주자.

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="false">
 
  <!-- 서블릿 필터 코드 -->
 
 	<filter>
 		<filter-name>CharEncodingFilter</filter-name>
 		<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class>
 	</filter>
 	<filter-mapping>
 		<filter-name>CharEncodingFilter</filter-name>
 		<url-pattern>/*</url-pattern> 	
 	</filter-mapping>
 
 <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>

</web-app>

<filter>에서 필터의 정보를 입력하고, <filter-mapping>에서 필터의 매핑될 이름과 어떤 특정 URL 패턴에 대해서 이 필터를 적용할지 쓸 수 있다. 여기서는 /*를 사용해서 모든 URL에 사용하도록 했다.
이제 실행화면을 보자! reg.html 파일을 실행하면 된다.

reg.html 실행화면


화면에 아무것도 출력되지 않았다. 왜 일까????? 아까 이야기했듯이 이 필터에서 전달, 그리고 권한 부여, 인증 등을 할 수 있다고 했다. 하지만 클릭할 때마다 시스템창에 Hello, Servlet Filter가 출력됨을 보면 정상적으로 잘 작동하고 있다는 말씀! 그러면 이제 값을 전달할 수 있도록 다시 코드를 추가하자.
CharacterEncodingFilter.java

package com.newlecture.web.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 {
		
		System.out.println("Before, Servlet Filter");
		chain.doFilter(request, response);
		System.out.println("After, Servlet Filter");
	
	}

}

Chian.doFilter(request, response); 라는 코드는 받은 값을 그대로 넘겨주는 역할을 한다.
전 후로 print문을 넣어서 잘 작동되는지를 확인하자.

Web.xml 코드를 통한 Servlet Filter 정상작동 출력화면

이로써 Servlet Filter 1번 방법이었다.

2번째 방법 어노테이션 @Annotation을 이용한 방법이다.
먼저 1번에서 추가한 web.xml 파일에서 서블릿 필터 코드를 주석처리!

<?xml version="1.0" encoding="UTF-8"?>

 <!-- 서블릿 필터 코드 -->
 <!-- 
 	<filter>
 		<filter-name>CharEncodingFilter</filter-name>
 		<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class>
 	</filter>
 	<filter-mapping>
 		<filter-name>CharEncodingFilter</filter-name>
 		<url-pattern>/*</url-pattern> 	
 	</filter-mapping>
  -->
 
 <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>

</web-app>

주석처리 후에는 CharaterEncodingFilter.java 파일에 어노테이션을 추가해주자!

package com.newlecture.web.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");
		chain.doFilter(request, response);
		
	
	}

}

Noticereg.java 서블릿에서 주석처리했던 request.setCharterEncoding("UTF-8"); 코드를
CharaterEncodingFilter.java에 추가해준다. 
그리고 @WebFilter("/*) 어노테이션을 추가해서 /* 모든 URL에 필터를 적용시켜주자!

어노테이션을 이용한 Servlet Filter 정상 작동 출력화면

어노테이션을 이용하면 Web.xml의 코드들을 하나하나 수정하지 않고, 코드 두줄로 필터 추가가 가능해진다!

반응형
댓글
공지사항