필터란 브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답과 관련하여 여러 가지 작업을 처리하는 기능이다.

프로그래밍을 하다가 한글 인코딩처럼 각 서블릿에서 반복적으로 처리해야 하는 작업이 있을 수 있는데, 이런 경우 서블릿의 공통 작업을 미리 필터에서 처리하면 반복해서 작업할 필요가 없다.

파일 구성은 다음과 같다.

그럼 우선 login.html 파일 먼저 작성해보자

<login.html>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form name="frmLogin" method="post" action="login" encType="utf-8">
		이름 : <input type="text" name="user_name"><br> 
		비밀번호 : <input type="password" name="user_pw"><br /> 
		<input type="submit" value="로그인">
	</form>
</body>
</html>

그 다음 LoginTest.java 파일을 작성해보자

<LoginTest.java>

package sec03.ex01;

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

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

@WebServlet("/login")
public class LoginTest extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
		//request.setCharacterEncoding("utf-8"); post 방식으로 한글 전송시 인코딩 작업을 생략한다.
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String user_name = request.getParameter("user_name");
		String user_pw = request.getParameter("user_pw");
		out.println("<html><body>");
		out.println("이름은"+user_name+"<br>");
		out.println("비밀번호는"+user_pw+"<br>");
		out.println("</body></html>");
	}
}

 다음과 같이 이름과 비밀번호를 입력한 후 로그인 버튼을 클릭하면

한글 인코딩이 안되어 글씨가 깨져서 나온다.

이번에는 필터를 이용해 한글 인코딩을 구현해보도록하자

아래 표시한 것과 같이 진행한다.

수정하고

모든 요청에 대해 필터 기능을 수행하도록 Pattern을 /*로 수정한다.

필터 클래스가 생성된 것을 확인할 수 있다.

필자는 미리 만들었기 때문에 만들어둔 코드를 보도록하자.

package sec03.ex01;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class EncoderFilter
 */
/* WebFilter 애너테이션을 이용해 모든 요청이 필터를 거치게 한다 */
/* 사용자 정의 필터는 반드시 Filter 인터페이스를 구현해야 한다. */

@WebFilter("/*")
public class EncoderFilter implements Filter {

    /**
     * Default constructor. 
     */
    public EncoderFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here

		// pass the request along the filter chain
		System.out.println("doFilter 호출");
		/* 한글 인코딩을 설정한다. */
		request.setCharacterEncoding("utf-8");
		/* 웹 애플리케이션의 컨텍스트 이름을 가져온다. */
		String context = ((HttpServletRequest)request).getContextPath();
		/* 웹 브라우저에서 요청한 요청 URI를 가져온다 */
		String pathinfo = ((HttpServletRequest)request).getRequestURI();
		/* 요청 URI의 실제 경로를 가져온다. */
		String realPath = request.getRealPath(pathinfo);
		String mesg = "Context 정보 : "+context
				+ "\n URI 정보 : " + pathinfo
				+ "\n 물리적 경로 : " + realPath;
		System.out.println(mesg);
		/* 다음 필터로 넘기는 작업을 수행한다 */
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 여기서 실제 인코딩이 이루어 지는 부분은 바로 다음 부분이다.

해당 부분에서 한글 인코딩 작업이 이루어진다.

그럼 톰캣을 재실행하고 다시 한번 결과를 보자

한글 인코딩이 잘 된 것을 확인할 수 있다.

'[책] > 자바 웹을 다루는 기술' 카테고리의 다른 글

6. Thumnail을 사용해보자  (0) 2020.01.14
5. tiles를 사용해보자  (0) 2020.01.10
3. 세션 쿠키 사용하기  (0) 2020.01.06
2. 쿠키란?  (0) 2020.01.06
1. server.xml을 이용하여 컨텍스트 등록하기  (0) 2020.01.06

+ Recent posts