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 |