정리노트

[JSP] 필터

망고고래 2023. 12. 14. 16:01

12장. 필터

1. 필터의 개요

2. Filter 인터페이스의 구현 클래스

3. web.xml 파일의 필터 구성

 

예제1

필터에서 매개변수와 값 전달받기

 

①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 filterChain)
			throws IOException, ServletException {
		System.out.println("Filter02 수행...");
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
        //form에서 값 취득
		
		String param1 = filterConfig.getInitParameter("param1");
		String param2 = filterConfig.getInitParameter("param2");
        //<filter>의 <init-param> <param-name> <param-value>에서 설정한 값 취득
		
		String message;
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
		if(id.equals(param1)&&passwd.equals(param2)) {
        //form에서 입력받은 값이 <init-param>에서 설정한 값과 일치하는지 비교
			message = "로그인 성공";
		}else {
			message = "로그인 실패";
		}
		
		writer.println(message);
		
		filterChain.doFilter(request, response);
		
	}

	@Override
	public void destroy() {
		System.out.println("Filter02 해제...");
	}
	
	
}

 

②web.xml 파일에서 <init-param>으로 파라미터 생성 및 초기화

  <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>

 

③값을 입력받을 form 태그가 있는 JSP 파일 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Filter</title>
</head>
<body>
	<form method="post" action="filter02_process.jsp">
		<p>아이디: <input type="text" name="id">
		<p>비밀번호: <input type="text" name="passwd">
		<p><input type="submit" value="전송">
	</form>
</body>
</html>

 

④form 태그에서 입력받은 데이터를 처리할 JSP 파일 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Filter</title>
</head>
<body>
	<%
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
	%>
	<p>입력된 id값: <%=id %>
	<p>입력된 pw값: <%=passwd %>
</body>
</html>

 

 

 

예제2

필터로 로그 기록하기(예제 1에 이어서)

①java로 filter 파일 생성

package ch12;

import javax.servlet.*;
import java.util.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;

public class LogFileFilter implements Filter{
	
	PrintWriter writer;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		String filename = filterConfig.getInitParameter("filename");
        //web.xml에서 지정한 경로 취득, filename에 저장
		if(filename==null) {
			throw new ServletException("로그 파일의 이름을 찾을 수 없습니다.");
		}
		try {
			writer = new PrintWriter(new FileWriter(filename, true), true);
            //filename(경로) 안에 출력하는 PrintWriter 클래스
		} catch (IOException e) {
			throw new ServletException("로그 파일을 열 수 없습니다.");
		}
	}
    //한 번만 실행해도 되는 코드 작성

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		writer.printf("현재일시: %s %n", getCurrentTime());
		String clientAddr = request.getRemoteAddr();
        //헤더의 요소값 취득해서 변수에 저장
		writer.printf("클라이언트 주소: %s %n", clientAddr);
        //변수에 저장한 요소값을 printf로 형식을 정해서 출력
        //writer: init()에서 생성한 참조변수. file 안에 출력하는 객체
		
		filterChain.doFilter(request, response);
		
		String contentType = response.getContentType();
		writer.printf("문서의 콘텐츠 유형: %s %n", contentType);
		writer.println("――――――――――――――――――――――――――――");
		
	}

	@Override
	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());
	}
	
}

 

 

②web.xml 파일에 작성

  <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>

 

jsp 페이지 실행시 monitor.log에 내용 출력

현재일시: 2023/12/14 12:07:30
클라이언트 주소: 0:0:0:0:0:0:0:1
문서의 콘텐츠 유형: text/html;charset=UTF-8
――――――――――――――――――――――――――――

 

'정리노트' 카테고리의 다른 글

[JSP] 세션  (0) 2023.12.18
[JSP]  (0) 2023.12.15
[JSP] 시큐리티, 예외 처리, 필터  (0) 2023.12.13
[JSP] 다국어 처리, 시큐리티  (0) 2023.12.12
[JSP] 유효성 검사, 다국어 처리  (0) 2023.12.11