티스토리 뷰
AuthenFilter.java
package ch12.com.filter;
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 destroy() {
// TODO Auto-generated method stub
Filter.super.destroy();
}
// 로드 및 초기화에 필요한 메서드 오버라이딩
@Override
public void init(FilterConfig filterConfig) throws ServletException{
System.out.println("Frlter01 초기화....");
}
// 해당 매핑이 된 jsp 페이지에 대해 해당 값이 입력되었을 때 수행되어야 할 제어문 작성
@Override
// 요청,응답,체인 작성
public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException
{
// 수행중 가이드 작성
System.out.println("Filter01.jsp 수행...");
// 변수 설정
String name= request.getParameter("name");
// 해당 변수의 값이 null이거나 공백일 경우 수행
if(name==null || name.equals(""))
{
// 인코딩 작업
response.setCharacterEncoding("UTF-8");
// 페이지 인코딩
response.setContentType("text/html; charset=UTF-8");
// out.println과 동일하나 jsp 사용할 수 있는 메서드 사용
PrintWriter writer = response.getWriter();
// 조건문에 따른 가이드 메세지 작성
String message ="입력된 name 값은 null입니다.";
// 가이드 메세지 출력
writer.println(message);
// 값 반환
return;
}
// 연속적으로 필터가 있을 경우 다음 필터로 제어를 넘길 수 있도록
// FilterChain 객체 타입의 dofilter() 메서드 작성
// dofilter의 매개변수로 filterchain 묶기
filterChain.doFilter(request, response);
}
}
web.xml
filter 작성
<filter>
filter name 작성
<filter-name>Filter01</filter-name>
filter 적용 클래스 작성- 자바는 '/' 말고 '.'을 사용, .java 사용x
<filter-class>ch12.com.filter.AuthenFilter</filter-class>
</filter>
filter-mapping 적용할 jsp페이지 작성
<filter-mapping>
Filter name 작성
<filter-name>Filter01</filter-name>
url-pattern 을 통해 해당 페이지에 필터장착.
<url-pattern>/ch12/filter01_process.jsp</url-pattern>
</filter-mapping>
filter01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- form 작성. 해당 값을 action으로 갈때 request 객체에 넣어두고 간다. -->
<!-- method를 post방식으로 웹브라우저에서 웹서버로 전달 -->
<form action="filter01_process.jsp" method="post">
<!-- name 값 text type으로 입력 -->
<p> 이름 : <input type="text" name="name">
<!-- submit 방식으로 전송 버튼 누를 때 이동 -->
<!-- -->
<input type=submit value="전송">
</form>
</body>
</html>
filter_process.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- mapping 설정된 jsp 페이지. -->
<%
/* request에 담긴 name값의 value를 name에 할당. */
String name = request.getParameter("name");
%>
<!-- 해당 값을 출력. -->
<!-- null값 || 공백일 경우 web.xml에 설정된 필터를 통해 java AuthenFilter.java의 -->
<!-- 제어문 if 작동. -->
<p> 입력된 결과 값 : <%=name%>
</body>
</html>
InitParameterFilter.java
package ch12.com.filter;
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 InitParameterFilter implements Filter{
// 해당 클래스에서만 사용할 수 있도록 접근제어자 private 작성 및 변수 설정.
private FilterConfig filterConfig = null;
// init() 메서드를 통해 로드및초기화를 시켜준다. 예외를 ServletException으로 처리하게끔 던져준다.
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("Filter02 초기화..");
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
// TODO Auto-generated method stub
// doFilter() 메서드가 작동하는지 가이드 작성
System.out.println("Filter02 수행중...");
// 변수 설정
// id,passwd 값을 request의 내장객체 메서드인 getParameter()를 통해 key입력을 통해
// 관련한 값을 id,passwd에 할당
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
// filterConfig는 web.xml 의 <init-param> name,value값을 가져온다.
// filterConfig안의 메서드인 getInitParameter()메서드를 통해 해당 입력 key의 값을 변수에 할당.
String param1 = filterConfig.getInitParameter("param1");
String param2 = filterConfig.getInitParameter("param2");
// 문자열 선언 / 제어문을 통한 실행부분을 통해 작성하기 위함
String message;
// response 안에 setCharacterEncoding, setContentType을 통해 UTF-8 지정
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
// PrintWriter 타입으로 response의 getWriter메서드를 참조변수에 저장.
// 출력을 해주는 메서드 out.println과 동일.
PrintWriter writer = response.getWriter();
// 입력 값과 web.xml 지정값이 일치할 경우와 일치하지 않을 경우 해당 문구 초기화
if(id.equals(param1) && passwd.equals(param2))
{
message = "로그인 성공했습니다.";
}
else
{
message = "로그인 실패했습니다.";
}
// 출력문구
writer.println(message);
// 필터가 연속적으로 일어날 경우 다음 필터로 넘어가지도록(체이닝) FilterChain
// 객체 타입의 doFilter() 메서드 작성.
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
Filter.super.destroy();
System.out.println("Filter02 해제...");
}
}
web.xml
filter작성
<filter>
filter-name작성
<filter-name>Filter02</filter-name>
필터 클래스 경로 지정.
<filter-class>ch12.com.filter.InitParameterFilter</filter-class>
id,passwd 변수에 value값 지정.
<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 지정
<filter-name>Filter02</filter-name>
url-pattern mapping 대상 지정.
<url-pattern>/ch12/filter02_process.jsp</url-pattern>
</filter-mapping>
filter02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- form 태그 작성 /이동할 페이지 action 작성, 웹브라우저에서 웹 서버로 보내는 방법 method로 설정 -->
<form action="filter02_process.jsp" method="post">
<!-- input 박스 생성 name 값 id 지정 -->
<p> id : <input type="text" name="id">
<!-- name value passwd 지정 -->
<p> passwd : <input type="text" name="passwd">
<br>
<!-- submit 전송 버튼 누르면 action을 취한다. -->
<input type=submit value="전송">
</form>
</body>
</html>
filter02_process.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</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.com.filter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import java.text.*;
import javax.servlet.*;
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;
// private FilterConfig filterConfig = null;
@Override
// init() 메서드 실행 매개변수로 filterConfig 타입의 filterConfig 변수 / 예외 발생시 ServletException으로 전송
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
Filter.super.init(filterConfig);
// filterConfig안의 getparameter() 메서드를 통해 "filename"을 가져와 문자열타입의 변수에 할당
String filename = filterConfig.getInitParameter("filename");
//filename 값이 null일 경우 실행
if(filename==null)
{
//객체 생성후 던지기(일회용)
throw new ServletException("로그 파일의 이름을 찾을 수 없습니다.");
}
// 예외 발생할 구문에 try문 작성
try
{
// jsp에서 출력을 시켜줄 메서드 PrintWriter 객체 생성.
// PrintWriter를 해야하는데 파일이 없을 수가 있으니 파일 또한 생성( new FileWriter)
// FileWriter의 매개변수 첫번째는 로그 파일의 이름을 설정하는 것이고, true값을 두번째로 전달
// 함으로써 내용을 이어서 추가할 수 있도록 합니다.
// PrintWriter의 매개변수의 두번째 값으로 true를 적어주는 이유는 객체 생성 시에
// true를 매개변수로 전달해 자동으로 flush() 메서드를 호출해서 버퍼를 비워주도록 해줍니다.
writer =new PrintWriter(new FileWriter(filename,true),true );
}
// 발생할 예외를 처리할 객체 생성
catch(IOException e)
{
// ServletException 예외를 발생새켜서 로그 파일을 열 수 없다는 메세지를 출력해줍니다.
throw new ServletException("로그 파일을 열 수 없습니다.");
}
}
// doFIlter() 메서드 생성, 매개변수로 request,response,filterChain 을 받습니다.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
// TODO Auto-generated method stub
// printf - %s는 문자열, %n는 줄바꿈 , getCurrentTime()메서드를 통해 현재 시간을 알려줍니다.
writer.printf("현재 일시 : %s %n " , getCurrentTime());
// request의 내장객체인 getRemoteAddr()메서드를 통해 IP주소값을해당 변수에 할당합니다.
String clientAddr = request.getRemoteAddr();
// IP주소가 저장된 문자열 변수 출력메서드를 통해 출력합니다.
writer.printf("클라이언트 주소 : %s %n", clientAddr);
// 필터가 이어질 수 있게 FilterChain을 통한 doFilter에 사용되는 필터를 이어줍니다.
filterChain.doFilter(request, response);
// response의 내장객체인 getContentType()메서드를 통해 요청한 문서의 콘텐츠 유형을 가져와
// 문자열 변수에 할당합니다.
String contentType =response.getContentType();
// 문서 콘텐츠 유형이 저장된 변수를 출력합니다.
writer.printf("문서의 콘텐츠 유형 : %s %n " , contentType);
// 구분선을 출력합니다.
writer.println("-----------------------------------");
}
// 소멸을 하기전에 실행하는 메서드
@Override
public void destroy() {
// TODO Auto-generated method stub
Filter.super.destroy();
// writer의 메서드를 종료시켜줍니다.
writer.close();
}
private String getCurrentTime() {
// TODO Auto-generated method stub
// DateFormat타입으로 SimpleDateFormat메서드에 패턴을 담아 변수에 저장합니다.
DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// Calendar객체 안의 getInstance()메서드를 통해 현재시간을 변수에 저장합니다.
Calendar calendar = Calendar.getInstance();
// 현재 시간을 설정하기 위해서 아래 구문을 호출합니다.
calendar.setTimeInMillis(System.currentTimeMillis());
// calendar 객체의 시간을 formatter의 형식에 맞게 문자열로 변환되어 반환합니다.
// 따라서 getCurrentTime()메서드를 호출한다면 formatter에 저장된
// 패턴의 형식에 따라 현재 시간을 문자열로 얻을 수가 있습니다.
return formatter.format(calendar.getTime());
}
}
web.xml
필터 작성
<filter>
필터 네임 작성
<filter-name>Filter02_2</filter-name>
해당 필터의 java 클래스 지정/경로
<filter-class>ch12.com.filter.LogFileFilter</filter-class>
필터에 필요한 변수,값 작성
<init-param>
변수 이름을 filename으로 설정
<param-name>filename</param-name>
값을 해당 경로로 설정
<param-value>C:\\logs\\monitor.log</param-value>
</init-param>
</filter>
필터 매핑 지정
<filter-mapping>
필터 이름 지정
<filter-name>Filter02_2</filter-name>
필터를 사용할 jsp page 지정
<url-pattern>/ch12/filter02_process.jsp</url-pattern>
</filter-mapping>
filter02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- form 태그 작성 /이동할 페이지 action 작성, 웹브라우저에서 웹 서버로 보내는 방법 method로 설정 -->
<form action="filter02_process.jsp" method="post">
<!-- input 박스 생성 name 값 id 지정 -->
<p> id : <input type="text" name="id">
<!-- name value passwd 지정 -->
<p> passwd : <input type="text" name="passwd">
<br>
<!-- submit 전송 버튼 누르면 action을 취한다. -->
<input type=submit value="전송">
</form>
</body>
</html>
filter02_process.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- -->
<%
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
%>
<p> 입력된 id 값 : <%=id%>
<p> 입력된 pw 값 : <%=passwd %>
</body>
</html>