[쉽게 배우는 JSP 웹 프로그래밍] 12장 정리, 연습문제
필터는 클라이언트와 서버 사이에서 request와 response 객체를 먼저 받아 공통적으로 필요한 부분을 처리하는 것으로, Filter 인터페이스를 구현하는 자바 클래스를 통해 제공된다. 필터를 사용하려면 web.xml 파일을 통해 JSP 컨테이너에 어떤 필터가 어떤 리소스에 대해 적용되는지 알려줘야 한다. 이 문서는 필터의 개념, Filter 인터페이스의 구현 클래스 작성 방법, 그리고 web.xml 파일에 필터를 구성하는 방법에 대해 설명하고 있다.
Feb 28, 2024
web.xml 파일의 필터 구성
AuthenFilter.jsp
package ch12; import java.io.IOException; import java.io.PrintWriter; 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 AuthenFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter01 초기화..."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Filter01.jsp 수행..."); request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); if (name == null || name.equals("")) { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter writer = response.getWriter(); String message = "입력된 name 값은 null 입니다."; writer.println(message); return; } chain.doFilter(request, response); } @Override public void destroy() { System.out.println("Filter01 해제..."); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app> <security-role> <role-name>admin</role-name> </security-role> <security-constraint> <web-resource-collection> <web-resource-name>JSPBook</web-resource-name> <url-pattern>/ch10/practice/practice04.jsp</url-pattern> <http-method>GET</http-method> </web-resource-collection> <auth-constraint> <description></description> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/ch10/practice/practice04_login.jsp </form-login-page> <form-error-page>/ch10/practice/practice04_login_failed.jsp </form-error-page> </form-login-config> </login-config> <!-- <error-page> <error-code>500</error-code> <location>/ch11/errorCode_error.jsp</location> </error-page> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/ch11/practice/practice05_error.jsp</location> </error-page> --> <filter> <filter-name>Filter02</filter-name> <filter-class>ch12.InitParamFilter</filter-class> <init-param> <param-name>param1</param-name> <param-value>admin</param-value> </init-param> <init-param> <param-name>param2</param-name> <param-value>1234</param-value> </init-param> </filter> <filter-mapping> <filter-name>Filter02</filter-name> <url-pattern>/ch12/filter02_process.jsp</url-pattern> </filter-mapping> <filter> <filter-name>Filter02_2</filter-name> <filter-class>ch12.LogFileFilter</filter-class> <init-param> <param-name>filename</param-name> <param-value>c:\\logs\\monitor.log</param-value> </init-param> </filter> <filter-mapping> <filter-name>Filter02_2</filter-name> <url-pattern>/ch12/filter02_process.jsp</url-pattern> </filter-mapping> <filter> <filter-name>loginFilter</filter-name> <filter-class>ch12.practice.LoginCheckFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/ch12/practice/practice04_success.jsp</url-pattern> </filter-mapping> </web-app>
filter01.jsp
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>Filter</title> </head> <body> <form action="filter01_process.jsp" method="post"> <p> 이름: <input type="text" name="name"> <input type="submit" value="전송"> </form> </body> </html>
filter01_process.jsp
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>Filter</title> </head> <body> <% String name = request.getParameter("name"); %> <p> 입력된 name 값 :<%=name %> </body> </html>
InitParamFilter.java
package ch12; import java.io.IOException; import java.io.PrintWriter; 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 InitParamFilter implements Filter { private FilterConfig filterConfig = null; @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter02 초기화..."); this.filterConfig = filterConfig; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Filter02.jsp 수행..."); String id = request.getParameter("id"); String passwd = request.getParameter("passwd"); String param1 = filterConfig.getInitParameter("param1"); String param2 = filterConfig.getInitParameter("param2"); String message; response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter writer = response.getWriter(); if(id.equals(param1)&&passwd.equals(param2)) message = "로그인 성공했습니다."; else message = "로그인 실패했습니다."; writer.println(message); chain.doFilter(request, response); } @Override public void destroy() { System.out.println("Filter02 해제..."); } }
filter02.jsp
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>Filter</title> </head> <body> <form action="filter02_process.jsp" method="post"> <p> 이름: <input type="text" name="id"> <p> 비밀번호: <input type="text" name="passwd"> <p> <input type="submit" value="전송"> </form> </body> </html>
filter02_process.jsp
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>Filter</title> </head> <body> <% String id = request.getParameter("id"); String passwd = request.getParameter("passwd"); %> <p> 입력된 id 값 :<%=id %> <p> 입력된 pw 값 :<%=passwd %> </body> </html>
LogFileFilter.java
package ch12; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; 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 LogFileFilter implements Filter { PrintWriter writer; public void init(FilterConfig filterConfig) throws ServletException { String filename = filterConfig.getInitParameter("filename"); if (filename == null) throw new ServletException("로그 파일의 이름을 찾을 수 없습니다."); try { writer = new PrintWriter(new FileWriter(filename, true), true); } catch (IOException e) { throw new ServletException("로그 파일을 열 수 없습니다."); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { writer.printf("현재일시 : %s %n", getCurrentTime()); String clientAddr = request.getRemoteAddr(); writer.printf("클라이언트 주소 : %s %n", clientAddr); chain.doFilter(request, response); String contentType = response.getContentType(); writer.printf("문서의 콘텐츠 유형 : %s %n", contentType); writer.println("----------------------------------"); } public void destroy() { writer.close(); } private String getCurrentTime() { DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); return formatter.format(calendar.getTime()); } }
핵심 키워드
- 필터는 클라이언트와 서버 사이에서 request와 response 객체를 먼저 받아 사전/사후 작업 등 공통적으로 필요한 부분을 처리하는 것이다.
- Filter 인터페이스는 필터 기능을 구현하는 데 핵심적인 역할을 한다. 클라이언트와 서버의 리소스 사이에 위치한 필터의 기능을 제공하기 위해 자바 클래스로 구현해야 한다.
- int()은 필터 인스턴스의 초기화 메소드다.
- doFilter()는 필터 기능을 작성하는 메소드다.
- destroy()는 필터 인스턴스의 종료 전에 호출되는 메소드다.
- 필터를 사용하려면 어떤 필터가 어떤 리소스에 대해 적용되는지 JSP 컨테이너에 알려줘야 한다. 이는 web.xml 파일을 통해 이루어진다.
- <filter>는 웹 애플리케이션에서 자바 필터와 매개변수를 설정하는 데 사용한다.
- <filter-name>은 필터 이름을 설정한다.
- <filter-class>는 자바 클래스 이름을 설정한다.
- <init-param>은 매개변수와 값을 설정한다.
- <filter-mapping>은 특정 리소스에 대해 어떤 필터를 사용할지 설정하는 데 사용한다.
- <filter-name>은 필터 이름을 설정한다.
- <url-pattern>은 URL 패턴을 설정한다.
연습문제
practice01.jsp
01 필터는 클라이언트와 서버 사이에서 request와 response 객체를 먼저 받아 사전/사후 작업 등 공통적으로 필요한 부분을 처리하는 것이다. 02 int()은 필터 인스턴스의 초기화 메소드다. doFilter()는 필터 기능을 작성하는 메소드다. destroy()는 필터 인스턴스의 종료 전에 호출되는 메소드다. 03 <filter>는 웹 애플리케이션에서 자바 필터와 매개변수를 설정하는 데 사용한다. <filter-mapping>은 특정 리소스에 대해 어떤 필터를 사용할지 설정하는 데 사용한다.
practice04.jsp
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>Filter</title> </head> <body> <form action="practice04_process.jsp" method="post"> <p> 이름: <input type="text" name="id"> <p> 비밀번호: <input type="text" name="passwd"> <p> <input type="submit" value="전송"> </form> </body> </html>
practice04_process.jsp
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>Filter</title> </head> <body> <% String id = request.getParameter("id"); String pw = request.getParameter("passwd"); if(id.equals("admin") && pw.equals("admin1234")){ %> <p> 로그인 성공 <% }else{ %> <p> 로그인 실패 <% } %> </body> </html>
practice04_success.jsp
<%@ page contentType="text/html; charset=utf-8"%> <html> <head> <title>Filter</title> </head> <body> <p>admin님 로그인을 성공했습니다. </body> </html>
practice05
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app> <security-role> <role-name>guest</role-name> </security-role> <security-constraint> <display-name>WebMarket Security</display-name> <web-resource-collection> <web-resource-name>WebMarket</web-resource-name> <description></description> <url-pattern>/addBook.jsp</url-pattern> </web-resource-collection> <auth-constraint> <description>권한 관리자명</description> <role-name>guest</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/login_failed.jsp</form-error-page> </form-login-config> </login-config> <error-page> <error-code>404</error-code> <location>/exceptionNoPage.jsp</location> </error-page> <filter> <filter-name>LogFilter</filter-name> <filter-class>filter.LogFilter</filter-class> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>LogFileFilter</filter-name> <filter-class>filter.LogFileFilter</filter-class> <init-param> <param-name>filename</param-name> <param-value>c:\\logs\\bookmarket.log</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFileFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
LogFilter.java
package filter; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; 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.http.HttpServletRequest; public class LogFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { System.out.println("BookMarket 초기화..."); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println(" 접속한 클라이언트 IP : " + request.getRemoteAddr()); long start = System.currentTimeMillis(); System.out.println(" 접근한 URL 경로 : " + getURLPath(request)); System.out.println(" 요청 처리 시작 시각 : " + getCurrentTime()); chain.doFilter(request, response); long end = System.currentTimeMillis(); System.out.println(" 요청 처리 종료 시각 : " + getCurrentTime()); System.out.println(" 요청 처리 소요 시각 : " + (end - start) + "ms "); System.out.println("==============================================================="); } public void destroy() { } private String getURLPath(ServletRequest request) { HttpServletRequest req; String currentPath = ""; String queryString = ""; if(request instanceof HttpServletRequest) { req = (HttpServletRequest)request; currentPath = req.getRequestURI(); queryString = req.getQueryString(); queryString = queryString == null ? "" : "?" + queryString; } return currentPath+queryString; } private String getCurrentTime() { DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); return formatter.format(calendar.getTime()); } }
LogFileFilter.java
package filter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; 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.http.HttpServletRequest; public class LogFileFilter implements Filter { PrintWriter writer; public void init(FilterConfig filterConfig) throws ServletException { String filename = filterConfig.getInitParameter("filename"); if (filename == null) throw new ServletException("로그 파일의 이름을 찾을 수 없습니다."); try { writer = new PrintWriter(new FileWriter(filename, true), true); } catch (IOException e) { throw new ServletException("로그 파일을 열 수 없습니다."); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { writer.println(" 접속한 클라이언트 IP : " + request.getRemoteAddr()); long start = System.currentTimeMillis(); writer.println(" 접근한 URL 경로 : " + getURLPath(request)); writer.println(" 요청 처리 시작 시각 : " + getCurrentTime()); chain.doFilter(request, response); long end = System.currentTimeMillis(); writer.println(" 요청 처리 종료 시각 : " + getCurrentTime()); writer.println(" 요청 처리 소요 시각 : " + (end - start) + "ms "); System.out.println("==============================================================="); } public void destroy() { writer.close(); } private String getURLPath(ServletRequest request) { HttpServletRequest req; String currentPath = ""; String queryString = ""; if (request instanceof HttpServletRequest) { req = (HttpServletRequest) request; currentPath = req.getRequestURI(); queryString = req.getQueryString(); queryString = queryString == null ? "" : "?" + queryString; } return currentPath + queryString; } private String getCurrentTime() { DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); return formatter.format(calendar.getTime()); } }
결론
해당 코드를 작성하면서 필터의 개념, Filter 인터페이스의 구현 클래스 작성 방법, web.xml 파일에 필터를 구성하는 방법을 익힐 수 있었다.
Share article