1. 정의

여과기 역할을 하는 프로그램.

서블릿 클래스가 실행되기 전/후에 어떤 데이터를 미리 실행시키거나, 아예 가로채서 서블릿이 실행되지 못하도록 한다.

자바 클래스 형태로 구현해야 한다.

http 요청, 응답을 변경 가능하고 재사용이 가능한 코드. 객체 형태를 띈다.

request와 최종 자원(jsp / servlet) 사이에 위치한다.


* 보통은 클라이언트 - 자원 사이에 필터가 1개가 존재는게 일반적이나, 다수도 가능하다.



2. 구조

1) 단일 필터 구조




2) 다중 필터 구조



3. 인터페이스

- Filter : 클라이언트와 최종 자원 사이의 객체 인터페이스

- ServletRequestWrapper : 필터가 요청을 변경하거나, 응답을 변경한 결과를 저장할 래퍼 클래스

- ServletResponseWrapper : 필터가 요청을 변경하거나, 응답을 변경한 결과를 저장할 래퍼 클래스



4. 용도

- 데이터 인코딩 : 서블릿 doPost 메소드에서 한글 인코딩을 대신 하는 역할

- 세션 데이터 인증 : 로그인 세션 체크

- 이벤트, 공지 등 팝업 추가



5. 예제


* 순서 : html -> filter 클래스 -> servlet 클래스 -> view jsp 페이지


1) 시작이 되는 html 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>필터 적용 예제</title>
</head>
<body>
<form method="post" action="ExampleS.do">
    이름 : <input type="text" name="name">
    <input type="submit" value="확인">
</form> 
</body>
</html>
cs


2) filter 클래스 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.filter;
 
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
/**
 * Servlet Filter implementation class ExampleBFilter
 */
//@WebFilter("/ExampleBFilter")
public class ExampleBFilter implements Filter {
 
    /**
     * Default constructor. 
     */
    public ExampleBFilter() {
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    // doFilter 메소드에서 한글 인코딩을 해줬다.
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
        
        request.setCharacterEncoding("utf-8");
        
        chain.doFilter(request, response);
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
}
cs


3) web.xml 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 <filter>
    <filter-name>ExampleBFilter</filter-name>
     <filter-class>com.filter.ExampleBFilter</filter-class>
 </filter>
  
 <filter-mapping>
    <filter-name>ExampleBFilter</filter-name>
    <!-- url-pattern : 같은 웹 애플리케이션 디렉터리 내 웹 컴포넌트에 적용할 때 -->
    <!--                 (ex. /* : 모든 웹 컴포넌트, *.jsp : 디렉터리 내의 jsp페이지에만 적용-->
    <!-- servlet-name : 특정 서블릿에만 적용할 때-->
    <url-pattern>/*</url-pattern>
 </filter-mapping>
cs


4) servlet 클래스 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.servlet;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * Servlet implementation class ExampleSServlet
 */
@WebServlet("/ExampleS.do")
public class ExampleSServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExampleSServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {
//        System.out.println("############");
        
        String name = request.getParameter("name");
        
//        System.out.println("name : " + name);
        
        request.setAttribute("name", name);
        
//        System.out.println("after name : " + request.getAttribute("name"));
        
        RequestDispatcher rd = request.getRequestDispatcher("result.jsp");
        
        rd.forward(request, response);
    }
}
cs


5) view 용 jsp 페이지 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>화면 결과 출력 예제</title>
</head>
<body>
    name : ${name}
</body>
</html>
cs


'BackEnd > Java' 카테고리의 다른 글

Java :: PrintWriter 객체 인코딩 오류시  (0) 2016.08.04
Servlet :: 필터로 한글 인코딩 설정하기  (0) 2016.06.18
Java :: Random 함수  (0) 2016.06.05
Jsp :: jsp 내장객체  (0) 2016.06.03
Java :: JDBC DAO 소스  (0) 2016.04.26

+ Recent posts