관리 메뉴

거니의 velog

231108_JSP 개론 10 본문

대덕인재개발원_웹기반 애플리케이션

231108_JSP 개론 10

Unlimited00 2023. 11. 8. 08:36

초기화는 한 번만 된다.
요청이 진행될 때 마다 실행되고 실제 로직은 여기서 처리한다.

[filter01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">필터</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH12</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<form action="filter01_process.jsp" method="post">
							이름 : <input type="text" name="name" /><br />
							<button type="submit">전송</button>
						</form>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

[filter01_process.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">필터</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH12</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<% 
							String name = request.getParameter("name");
						%>
						<p>입력된 name 값 : <%= name %></p>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

[web.xml]

  <filter>
  	<filter-name>Filter01</filter-name>
  	<filter-class>kr.or.ddit.ch12.AuthenFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>Filter01</filter-name>
  	<url-pattern>/ch12/filter01_process.jsp</url-pattern>
  </filter-mapping>

[AuthenFilter.java]

package kr.or.ddit.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 {
	
	// 필터를 초기화 하도록 init() 메서드를 작성한다.
	@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 {
		// 파라미터로 넘긴 이름이 존재하지 않을 때 특정 메시지를 포함하고 있는 페이지를 리턴
		// 넘겨받은 이름이 없다면, "입력된 name값은 null 입니다, 다시 입력해주세요." 를 출력
		System.out.println("Filter01 수행...!");
		
		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 pw = response.getWriter();
			String msg = "<p>입력된 name 값은 null 입니다, 다시 입력해주세요!</p>";
			msg += "<a href='filter01.jsp'>Filter01 이동</a>";
			pw.println(msg);
			return; // 요청 URL로 넘어가지 않고 해당 필터에서 응답 페이지가 결과로 나간다.
		}
		
		// 연속적으로 필터가 있으면 다음 필터로 제어를 넘기도록 FilterChain 객체 타입의 doFilter() 메소드를 작성
		chain.doFilter(request, response);
	}
	
	// 필터를 종료하기 전에 호출하도록 destroy() 메소드를 작성한다.
	@Override
	public void destroy() {
		System.out.println("Filter01 해제...!");
	}

}

- http://localhost/ch12/filter01.jsp



[web.xml]

  <filter>
  	<filter-name>Filter02</filter-name>
  	<filter-class>kr.or.ddit.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>

[InitParamFilter.java]

package kr.or.ddit.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; // FilterConfig를 전역변수로 설정
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter02 초기화...!");
		System.out.println("web.xml에 설정한 param을 담고 있는 filterConfig를 전역 변수에 먼저 셋팅해 준다.");
		System.out.println("filterConfig.parameter 1 : " + filterConfig.getInitParameter("param1"));
		System.out.println("filterConfig.parameter 2 : " + filterConfig.getInitParameter("param2"));
		this.filterConfig = filterConfig;
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("Filter02 실행...!");
		request.setCharacterEncoding("UTF-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		String param1 = filterConfig.getInitParameter("param1");
		String param2 = filterConfig.getInitParameter("param2");
		
		String msg = "";
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter writer = response.getWriter();
		if(id.equals(param1) && pw.equals(param2)) {
			// 로그인 처리가 성공했을 때, filter02_process.jsp 페이지로 msg 정보를 담아서 넘겨준다. (scope는 request로)
			msg = "로그인 성공했습니다!";
			request.setAttribute("msg", msg);
		}else {
			// 로그인 처리가 실패했을 때, filter02_process.jsp로 넘어가지 않고 응답으로 아래 메세지를 출력한다.
			msg = "로그인 실패했습니다! <br />";
			msg += "<a href='filter02.jsp'>Filter02 이동</a>";
			writer.println(msg);
			return;
		}
		chain.doFilter(request, response);
	}
	
	@Override
	public void destroy() {
		System.out.println("Filter02 해제...!");
	}

}

[filter02.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">필터</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH12</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<form action="filter02_process.jsp" method="post">
							아이디 : <input type="text" name="id" /><br />
							비밀번호 : <input type="text" name="pw" /><br />
							<button type="submit">전송</button>
						</form>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

[filter02_process.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">필터</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH12</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<% 
							String msg = (String) request.getAttribute("msg");
							String id = request.getParameter("id");
							String pw = request.getParameter("pw");
						%>
						<p>메세지 : <%= msg %></p>
						<p>입력된 id 값 : <%= id %></p>
						<p>입력된 pw 값 : <%= pw %></p>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch12/filter02.jsp



[web.xml]

  <filter>
  	<filter-name>Filter02_1</filter-name>
  	<filter-class>kr.or.ddit.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_1</filter-name>
  	<url-pattern>/ch12/filter02_process.jsp</url-pattern>
  </filter-mapping>

[LogFileFilter.java]

package kr.or.ddit.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 {
	
	private PrintWriter writer;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter02_1 초기화...!");
		String filename = filterConfig.getInitParameter("filename");
		
		if(filename == null) {
			throw new ServletException("로그 파일의 이름을 찾을 수 없습니다!");
		}
		
		try {
			// PrintWriter
			// 두 번째 매개변수 : autoFlush 여부 (true/false)
			
			// FileWriter
			// 두 번째 매개변수 : append 여부 (true/false)
			writer = new PrintWriter(new FileWriter(filename, true), true);
		} catch (IOException e) {
			throw new ServletException("로그 파일을 열 수 없습니다.");
		}
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("Filter02_1 실행...!");
		
		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("============================================");
	}
	
	private String getCurrentTime() {
		DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(System.currentTimeMillis()); // 현재의 시스템 시간을 셋팅
		return formatter.format(cal.getTime()); // 지정한 포멧에 맞춰 시간 데이터를 출력
	}
	
	@Override
	public void destroy() {
		System.out.println("Filter02_1 해제...!");
		writer.close();
	}

}

폴더를 미리 만들어 둔다.

- http://localhost/ch12/filter02.jsp

로그인이 성공할 때마다 새로운 로그가 append 된다.


 

'대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231109_CRUD 과제  (1) 2023.11.09
231109_JSP 개론 11  (0) 2023.11.09
231107_JSP 과제 5  (0) 2023.11.07
231107_JSP 개론 9  (0) 2023.11.07
231106_JSP 개론 8  (0) 2023.11.06