반응형

 

연습 문제 01

 

필터란 무엇인가?

 

더보기

클라이언트와 서버 사이에서 request와 response 객체를 받아 사전/사후 작업 등 공통적으로 필요한 부분을 처리하는 것

 

클라이언트의 요청이 웹 서버의 서블릿, JSP, HTML 페이지 같은 정적 리소스에 도달하기 전,

정적 리소스에서 클라이언트로 응답하기 전에 필요한 전처리를 가능하게 함

 

 

 

연습 문제 02

 

Filter 인터페이스에 있는 메소드의 종류와 기능을 설명하시오.

 

더보기

init() : 필터 인스턴스의 초기화 메소드

 

doFilter() : 필터 기능을 작성하는 메소드

 

destroy() : 필터 인스턴스의 종료 전에 호출되는 메소드

 

 

 

연습 문제 03

 

web.xml 파일에 필터를 구성하는 요소의 종류를 설명하시오.

 

더보기
<filter>
	<filter-name></filter-name> : 필터 이름 설정
	<filter-class></filter-class> : 자바 클래스 이름 설정
	<init-param> : 매개변수와 값을 설정
		<param-name></param-name>
	</init-param>
</filter>
<filter-mapping>
	<filter-name></filter-name> : 필터 이름 설정
	<url-pattern></url-pattern> : URL 패턴 설정
</filter-mapping>

 

 

 

연습 문제 04

 

Filter 인터페이스를 이용하여 다음 조건에 맞게 JSP 애플리케이션을 만들고 실행 결과를 확인하시오.

 

 

 

 

 

연습 문제 05

 

다음 조건에 맞게 도서 웹 쇼핑몰을 위한 웹 애플리케이션을 만들고 실행 결과를 확인하시오.

 

 

더보기

web.xml

<filter>
  	<filter-name>LogFilter</filter-name>
  	<filter-class>filter.LogFilter</filter-class>
  	<init-param>
  		<param-name>filename</param-name>
  		<param-value>c:\\logs\\bookmarket.log</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>LogFilter</filter-name>
  	<!--  http://localhost/의 모든 하위 폴더 및 모든 url요청 시 작동 -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

 

 

LogFilter.java

package filter;

import java.io.File;
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 LogFilter implements Filter{
	PrintWriter writer;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
String filename = filterConfig.getInitParameter("filename"); // c:\\logs\\bookmarket.log
		
		try {
			writer = new PrintWriter(new FileWriter(filename,true),true); // doFilter에서도 쓰기 위해 전역으로 사용함
			
	        File file = new File(filename);
	        
	        if(!file.exists()) {
	           file.createNewFile();
	           
	           writer.println(file.getAbsolutePath() + " 파일이 생성되었습니다."); // 파일 생성했음을 로그에 추가한다는 뜻
	        }else {//있으면..
	           System.out.println(file.getAbsolutePath() + " 파일이 생성되어 있습니다.");
	        }
		} catch (IOException e) {
			throw new ServletException("로그 파일을 열 수 없습니다.");
		}
	}

	@Override
	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());
		
		//필터가 연속적으로 있다면 다음 필터로 제어 및 요청(request)/응답(response) 정보를 넘겨줌
		chain.doFilter(request, response);
		
		//시스템 현재 시간(종료시간)
		long end = System.currentTimeMillis();
		writer.println("요청 처리 종료 시각 : " + getCurrentTime());
		writer.println("요청 처리 소요 시간 : " + (end - start) + "ms");//1000분의 1초 단위
		writer.println("==================================");
	}
	
	@Override
	public void destroy() {
		writer.close();
	}
	
	private String getURLPath(ServletRequest request) {
		//HttpServletRequest 인터페이스 는 ServletRequest 인터페이스를 상속받음
		HttpServletRequest req;
		
		//currentPath : URL경로 => http://localhost/ch11/readParameterNoErrorPage.jsp
		String currentPath = "";
		
		//queryString : 요청파라미터 => name=개똥이
		String queryString = "";
		
		//instanceOf 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는 데 사용됨
		if(request instanceof HttpServletRequest) {
			//자식 = (cast)부모
			req = (HttpServletRequest)request;
			currentPath = req.getRequestURI(); //http://localhost/ch11/readParameterNoErrorPage.jsp
			System.out.println("currentPath : " + currentPath);
			queryString = req.getQueryString(); //name=개똥이         
			System.out.println("queryString : " + queryString);
			
			//삼항연산자
			queryString = queryString == null ? "" : "?"+queryString; // 파라미터에 ?를 붙임
		}
		//http://localhost/ch11/readParameterNoErrorPage.jsp?name=개똥이
		return currentPath + queryString;
	}//end getURLPath()
	
	//현재 시간을 얻어오는 메소드
	private String getCurrentTime() {
		//2023/03/31 17:29:12
		DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		
		//캘린더 객체 생성(싱글톤 : 메모리에 1번 생성하고 전역변수처럼 사용)
		Calendar calendar = Calendar.getInstance();
		
		//톰켓서버에서 제공해주는 시스템 현재 시간을 구해서 캘린더 객체에 세팅
		calendar.setTimeInMillis(System.currentTimeMillis());
		
		//2023/03/31 17:29:12 이러한 포맷을 준수하면서 리턴
		return formatter.format(calendar.getTime());
	}

}

 

결과 화면1

 

 

반응형