toggle menu

JSP 정리 - 필터

2012. 8. 21. 14:20 JAVA/JSP

client와 서버 사이에 필터가 존재해서 들어오는 request와 response 를 필터가 먼저 받아 사전작업/사후 작업 등 공통적으로 수행되는 부분을 작업을 수행.

예를들어 한글 인코딩의 경우 필터에 넣어두면 항상 한글 인코딩을 해줄 수 있다.

myFilter.java 파일
import java.io.IOException;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class myFilter implements Filter
{

	public void destroy()
	{
		System.out.println("디스트로이됨!");

	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
	throws IOException, ServletException
	{
		System.out.println("사전작업!");

		arg2.doFilter(arg0, arg1);

		System.out.println("사후작업!");

	}

	public void init(FilterConfig arg0) throws ServletException
	{
		System.out.println("필터 init됨!");

	}
}


위와 같은 형태로 필터를 하나 만들어줄 수 있다.
그런데 이렇게 필터를 만들어준 것만으로는 필터의 역할이 작동하지 않는다.
web.xml 파일에 등록이 필요하다.


<web-app>
...
	<filter>
		<filter-name>myFilter</filter-name>
		<filter-class>myFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>myFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
...
</web-app>


web.xml 파일에 위와 같이 필터를 설정해주면, 필터가 작동하는 것을 확인할 수 있다.


 

web.xml 파일에 Initial Parameter를 지정해서 값을 가져올 수 있는데, 사실 이게 무슨 장점이 있을까 생각이 들 때도 있다.
그러나 이렇게 초기값을 web.xml에 넣어놓으면 web.xml 파일의 내용을 수정하는 것만으로도 모든 서버에 적용이 되고 이미 컴파일된 클래스에도 별도의 재컴파일 없이 바로 적용 가능하다는 장점이 있다. 

<web-app>
...
	<filter>
		<filter-name>myFilter</filter-name>
		<filter-class>myFilter</filter-class>
		
		<init-param>
			<param-name>FILENAME</param-name>
			<param-value>c:\\myfilter.log</param-value>
		</init-param>
		<init-param>
			<param-name>DEFAULTENCODING</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
...
</web-app>


위와 같이 init-param 태그로 새로운 파라메터를 추가해주면, 이 값을 가져올 수 있게 된다.


import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class myFilter implements Filter
{
	String defaultEncoding;
	PrintWriter printWriter;

	public void destroy()
	{
		printLog("[필터 종료 시간] " + new Date(System.currentTimeMillis()).toLocaleString());
		
		try
		{
			printWriter.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
	{
		printLog("[필터 사전작업 시간] " + new Date(System.currentTimeMillis()).toLocaleString());
		
		request.setCharacterEncoding(defaultEncoding);
		
		filterChain.doFilter(request, response);

		printLog("[필터 사후작업 시간] " + new Date(System.currentTimeMillis()).toLocaleString());

	}

	public void init(FilterConfig arg0) throws ServletException
	{
		defaultEncoding = arg0.getInitParameter("DEFAULTENCODING");
		
		try
		{
			printWriter = new PrintWriter(new FileWriter(arg0.getInitParameter("FILENAME"), true), true);
			printLog("[필터 초기화 시간] " + new Date(System.currentTimeMillis()).toLocaleString());
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}

	}
	
	public void printLog(String log)
	{
		printWriter.println(log);
		System.out.println(log);
	}
}




JAVA/JSP 관련 포스팅 더보기