BackEnd/Servlet, JSP

[Servlet, JSP] FilterConfig, FilterChain

샤아이인 2022. 1. 13.

FilterChain

 

FilterChain은 필터가 실행될 때 doFilter() 메소드의 세번째 인자로 전달되는 객체 입니다.

 

web.xml 파일에서 설정한 <filter-mapping>에 대한 정보를 가지고 있죠!

즉, 클라이언트의 요청에 대한 필터들의 실행순서를 알고있는 객체인거죠. 이렇게 흐름을 제어할 수 있는 객체가 FilteChain 입니다.

void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

한글 처리 필터

 

전달받은 페이지에서 한글 처리를 해야 하는데, 한글이 필요한 페이지들 모두 사전에 필터를 적용하면 일괄적으로 처리가 가능합니다.

 

input 파일 3개가 있으며, 1개의 filter를 거친후 각각 3개의 servlet에 도달하게 될 것 입니다. 다음과 같이 말이죠!

1) Client

 

이름

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>입력 페이지</title>
</head>
<body>
<form action="output1" method="post">
	이름 : <input type="text" name="name">
	<input type="submit" value="확인">
</form>
</body>
</html>
 

 

과목

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>입력 페이지</title>
</head>
<body>
<form action="output2" method="post">
	과목 : <input type="text" name="subject">
	<input type="submit" value="확인">
</form>
</body>
</html>
 

 

학과

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>입력 페이지</title>
</head>
<body>
<form action="output3" method="post">
	학과 : <input type="text" name="dept">
	<input type="submit" value="확인">
</form>
</body>
</html>
 

 

2) Filter

import java.io.IOException;
import javax.servlet.*;

public class FlowFilterTwo implements Filter {
	public void init(FilterConfig config) {
		System.out.println("init() 호출 .......... two");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		System.out.println("doFilter() 호출 전 .......... two");
		chain.doFilter(request, response);
		System.out.println("doFilter() 호출 후 .......... two");
	}
	
	@Override
	public void destroy() {
		System.out.println("destory() 호출 .......... two");
	}
}
 

 

3) 요청 페이지

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/output1")
public class Output1Servlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.print(req.getParameter("name"));
		out.close();
	}
}
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/output2")
public class Output2Servlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.print(req.getParameter("subject"));
		out.close();
	}
}
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/output3")
public class Output3Servlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter out = resp.getWriter();
		out.print(req.getParameter("dept"));
		out.close();
	}
}
 

 

chain.doFilter(req, resp) 명령문이 실행되면, req 와 resp가 그대로 전달됩니다.

filter에서 UTF-8으로 으로 인코딩이 된후 req, resp가 그대로 서블릿들에 전달되기 때문에 별도로 서블릿 쪽에서 인코딩해줄 필요가 없어졌습니다!

 

결과는 다음과 같습니다. 이름만 실행한 결과입니다. 과목, 학과 또한 정상적으로 필터링 됩니다.

다만 아직 한가지 문제점이 있습니다.

한글처리를 할때 직접 하드코딩으로 문자코드를 지정한다는 점 입니다. FilterConfig를 이용하면 해결 가능합니다!

FilterConfig

 

필터 객체에서 사용할 값을 외부에서 설정하여 읽어들이는 방법을 사용하는 것 입니다.

web.xml에서 인자값을 넘겨주는 것 이죠! 다음과 같이 말이에요!

...	
    <filter>
		<filter-name>flow2</filter-name>
		<filter-class>com.edu.test.FlowFilterTwo</filter-class>
		<init-param>
			<param-name>en</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
...
 

<init-param>은 <filter>의 하위 태그로서 web.xml 파일에서 필터 객체에 변수를 전달하고 할 때 사용합니다.

 

Filter 파일을 다음과 같이 수정해 줍니다.

import java.io.IOException;
import javax.servlet.*;

public class FlowFilterTwo implements Filter {
	String charset;
	public void init(FilterConfig config) {
		System.out.println("init() 호출 .......... two");
		charset = config.getInitParameter("en");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding(charset);
		System.out.println("doFilter() 호출 전 .......... two");
		chain.doFilter(request, response);
		System.out.println("doFilter() 호출 후 .......... two");
	}
	
	@Override
	public void destroy() {
		System.out.println("destory() 호출 .......... two");
	}
}
 

init() 메소드는 필터객체가 생성될때 호출되는 콜백함수 입니다.

이때 FilterConfig 객체가 인자로 전달되는데요, FilterConfig 객체에는 현재 실행 중인 필터 객체에 대한 정보들이 담겨있습니다. 또한 필터에 대한 정보값을 추출하는 메소드가 포함되어있습니다.

 

web.xml 파일에 <filter> 태그로 설정되있는 값들이 그 정보 입니다.

따라서 FilterConfig는 <filter>태그에 서정한 정보를 추출해야 할 때 사용됩니다.

댓글