본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet 필터 : 로그 기록하기 2

728x90
반응형

03 web.xml 파일의 필터 구성

필터를 사용하려면 어떤 필터가 어떤 리소시에 대해 적용되는지 JSP컨테이너에 알려주어야 한다. 이는 웹 애플리케이션의 /WEB-INF/폴더에 존재하는 web.xml파일을 통해 이루어지므로 web.xml 파일에 필터를 설정한다. 

 

web.xml 파일에 필터를 설정할 때는 <Filter>와 <filter-mapping> 요소를 사용하여 형식은 다음과 같다. web.xml 파일에 여러개의 필터가 설정되어 있으면 선언된 순서대로 실행된다. 

<filter>
	<filter-name>...</filter-name>
    <fliter-class>...</filter-class>
    [<init-param>
    	<param-name>...</param-name>
        <param-value>...</param-value>
    </init-param>]
</filter>
<filter-mapping>
	<filter-name>...</filter-name>
    <url-pattern>...</url-pattern>
</filter-mapping>

 

<filter> 를 구성하는 하위 요소

요소 설명
<filter-name> 필터 이름을 설정한다.
<filter-class> 자바 클래스 이름을 설정한다
<init-param> 매개변수와 값을 설정한다.

 

<filter-mapping>을 구성하는 하위 요소

요소 설명
<filter-name> 필터 이름을 설정한다. 
<url-pattern> URL 패턴을 설정한다 

 

 

3.1 <filter> 요소 

<filter> 요소는 웹 애플리케이션에서 자바 필터와 매개변수를 설정하는 데 사용하며 형식은 다음과 같다. 

<filter>
	<filter-name>필터 이름</filter-name>
    <filter-class>글래스 이름 </filter-class>
    [<init-param>
    	<param-name>매개변수 이름</param-name>
        <param-value>매개변수 값</param-value>
    </init-param>]
</filter>

 

<init-param> 요소에 설정된 매개변수와 값을 자바 또는 JSP코드에서 접근하는 형식은 다음과 같다. 

String value= getServletConfig().getInitParameter("매개변수 이름");

 

 

 

다음은 <filter> 요소에 필터 이름과패키지를 포함한 필터를 구현한 자바 클래스 이름을 설정하는 예이다. 이때 필터이름은 자바 클래스 이름과 같지 않아도 된다. 

 

[<filter>요소 사용 예 : 필터 이름 myFilter와 클래스 이름 LoggingFilter 설정]

<filter>
	<filter-name>myFilter</filter-name>
    <filter-class>ch12.com.filter.LoggingFilter</filter-class>
</filter>

 

 

다음은 <filter> 요소 내에 <init-param> 요소를 이용하여 매개변수와 값을 설정하는 예이다. 필터가 초기화될 때 , 즉 필터의 init() 메소드가 호출될 때 전달되는 매개변수와 값을 설정했다. 

[<filter> 요소 사용 예 : 매개변수 param 과 값 admin 설정]

<filter>
	<filter-name>myFilter</filter-name>
    <filter-class>ch12.com.filter.LoggingFilter</filter-class>
    <init-param>
    	<param-name>param</param-name>
        <param-value>admin</param-value>
    </init-param>
</filter>

 

위의 예에서 <init-param> 요소에 설정된 매개변수와 값을 자바 클래스에서 접근하려면 다음과 같이 작성한다. 

String value = getServletConfig().getInitParameter("param");

 

 

 

3.2 <filter-mapping>요소

<filter-mapping> 요소는 특정 리소스에 대해 어떤 필터를 사용할지 설정하는 데 사용하며 형식은 다음과 같다. 

<filter-mapping>
	<filter-name>필터 이름</filter-name>
    <url-pattern>요청 URL 패턴</url-pattern>
</filter-mapping>

 

다음은 <filter-mapping> 요소를 이용하여 모든 리소스에 대해 필터 MyFilter를 적용하는 에이다. 모든 리소스에 필터를 적용하기 위해 URL voxjsdmf /*로 설정했는데 , /*는 모든 요청을 URL 과 일치하는 경로로 매핑한다는 것을 의미한다. 

 

[<filter-mapping> 요소 사용 예: URL 패턴을 /* 로 설정]

<filter-mapping>
	<filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

다음은 <filter-mapping> 요소를 이용하여 특정 리소스에 대해 필터 MyFilter를 적용하는 예이다. 즉 특정 리소스 /ch12/filter.jsp 에 필터가 적용되며, 설정한 패턴은 /ch12/로 시작하고 filter.jsp 경로로 매핑한다는 것을 의미한다. 

 

[<filter-mapping> 요소 사용 예 / URL 패턴을 /ch12/filter.jsp 로 설정]

<filter-mapping>
	<filter-name>MyFilter</filter-name>
    <url-pattern>/ch12/filter.jsp</url-pattern>
</filter-mapping>

 

NOTE_요청 URL 패턴의 유형
<url-pattern>요소에 설정할 수 있는 요청 URL 패턴이 유형은 다음과 같다. 
- /로 시작하고 /* 로 끝나는 url-pattern 은 경로 매핑에 사용된다. 
- *로 시작하는 url-pattern은 확장자에 대한 매핑을 할 때 사용된다. 
- 나머지 다른 문자열은 정확한 매핑을 하는데 사용된다. 

다음은 요청 URL 패턴의 예이다

URL 패턴 설명
*.do .do 로 끝나는 모든 URL과 일치하는 파일 확장 패턴
/WebMarket/* /WebMarket/으로 시작하는 모든 URL 과 일치하는 경로 패턴
/MyFilter.jsp /MyFilter.jsp로만 일치하는 특정 패턴
/WebMarket/cart.jsp /WebMarket/cart.jsp 로만 일치하는 특정 패턴

 

[폼 페이지에서 전송된 요청 파라미터를 필터로 처리하기]

 

 

/JSPBook/src/ch12/com/filter/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{
	
	//필터를 초기화 하도록 init() 메소드를 작성한다. 
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter01 초기화.. ");
	}
	
	
	//필터를 리소스에 적용하도록 doFilter()메소드를 작성한다. 
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, 
			FilterChain filterChain) throws IOException, ServletException {
		System.out.println("Filter01.jsp 수행..");
		String name = request.getParameter("name");//폼페이지에서전송된 요청 파라미터를 전달받도록 request내장 객체의 
												   //geParameter()메소드를 작성한다. 
		
		
		//폼 페이지에서 전송된 요청 파라미터가 없으면 응답 웹페이지에 메시지를 출력하도록 응답 웹 페이지에 
		//대한 문자 인코딩, 콘텐츠 우형, 메시지 등을 작성한다. 
		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;
					
		}
		filterChain.doFilter(request, response);//연속적으로 필터가 있으면 다음 필터로 제어를 넘기도록 FilterChain 객체타입의
												// doFilter()메소드를 작성한다. 
	}
	
	
	//필터를 종료하기 전에 호출하도록 destory() 메소드를 작성한다. 
	@Override
	public void destory() {
		System.out.println("Filter01 해제..");
	}
}

 

 

JSPBook/Webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
	<security-role> 
		<description></description>
		<role-name>admin</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>/addProduct.jsp</url-pattern>
		</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>/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>Filter01</filter-name>
		<filter-class>ch12.com.filter.AuthenFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>Filter01</filter-name>
		<url-pattern>/ch12/filter01_process.jsp</url-pattern>
	</filter-mapping>
</web-app>

 

/JSPBook/Webapp/ch12/filter01.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
	<title>Filter</title>
</head>
<body>
	<form method="post" action="filter01_process.jsp">
	
		<p> name : <input type="text" name="name">
			<input type="submit" value="submit">
		
		
	</form>
</body>
</html>

 

 

JSPBook/webapp/ch12/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>

 

http://localhost:8080/JSPBook/ch12/filter01.jsp

 

filter01.jsp 에 아무것도 입력하지않고 submit을 합니다.
filter01_process.jsp 결과창
Console 창에 Filter01 초기화 와 Filter01  수행이 출력되는것을 확인할 수 있다.

 

728x90
반응형