필터란 브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답과 관련하여 여러 가지 작업을 처리하는 기능이다.
프로그래밍을 하다가 한글 인코딩처럼 각 서블릿에서 반복적으로 처리해야 하는 작업이 있을 수 있는데, 이런 경우 서블릿의 공통 작업을 미리 필터에서 처리하면 반복해서 작업할 필요가 없다.
파일 구성은 다음과 같다.
그럼 우선 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 |