[Web] 필터

2024. 8. 21. 14:40자바 웹 개발/세션 쿠키 필터 리스너

필터는 브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답과 관련해 여러 가지 작업을 처리하는 기능이다. 모든 서브릿에서 공통으로 처리하는 작업을 필터로 처리하면 편한다.

일단 login.html와 LoginTest 서블릿을 작성하자. 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>LoginPage</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="로그인">
		<input type="reset" value="다시입력">
	</form>
</body>
</html>
@WebServlet("/login")
public class LoginTest extends HttpServlet{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		String user_name = req.getParameter("user_name");
		String user_pw = req.getParameter("user_pw");
		out.println("<html><body>");
		out.println("이름은 " + user_name + "<br>");
		out.println("비밀번호는 " + user_pw + "<br>");
		out.println("</body></html>");
	}

}

 

req.setCharsetEncoding("utf-8")을 작성하지 않았기 때문에 한글을 작성하면 인코딩 문제가 발생한다. 

 

이제 필터를 이용해보자

필터를 만들고 class name에서 EncoderFilter를 입력한다. 

Edit을 누른 뒤에 모든 요청에 기능을 수행하도록 Pattern을 /*으로 수정한다. 

 

WebFilter 애너테이션을 확인해보고 다음과 같으면 정상이다. 

@WebFilter("/*")
public class EncoderFilter implements Filter {
	ServletContext context;
    /**
     * Default constructor. 
     */
    public EncoderFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 호출");
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter 호출");
		request.setCharacterEncoding("utf-8");
		String context = ((HttpServletRequest)request).getContextPath();  //컨텍스트 이름을 가져온다
		String pathinfo = ((HttpServletRequest)request).getRequestURI(); //브라우저가 요청한 요청 URI를 가져온다.
		String realPath = request.getRealPath(pathinfo); //요청 URI의 실제 경로를 가져온다. 
		
		String mesg = " Context 정보 : " + context + "\n URI 정보 : " + pathinfo + "\n URI 정보 : " + realPath;
		System.out.println(mesg);	
		chain.doFilter(request, response); 
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("utf-8 인코딩 ........");
		context = fConfig.getServletContext();
	}

}

정상 작동을 확인할 수 있다.