프로그래밍/JSP Servlet

JSP/Servlet – 필터(Filter)의 이해

가카리 2016. 3. 14. 22:45
반응형

 

JSP/Servlet – 필터(Filter)의 이해

 

필터란 클라이언트와 서버사이에서 request와 response객체를 필터가 먼저 받아 사전작업/사후작업 등 공통적으로 필요한 부분을 처리합니다.

필터에 대한 기본적인 내용은 다음 링크에 설명이 잘되어있습니다.

 

필터를 이용한 프로그래밍 Part1, 필터란 무엇인가!

 

필터가 어떤 순서로 동작하기 위해 위와 같이 예제를 구성합니다.

 

첫 번째로는 필터 클래스를 구현해봅시다. 필터클래스는 Filter 인터페이스를 구현해야 합니다.

 

/WEB-INF/classes/myfilter/SimpleFilter.java

package myfilter;

 

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;

 

public class SimpleFilter implements Filter{

 

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

 

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        System.out.println("웹컴포넌트 시작");

        chain.doFilter(request, response);//필터체인

        System.out.println("웹컴포넌트 완료");

        

    }

 

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

 

}

 

 

그 다음은 web.xml파일에 필터 클래스를 등록해야 합니다.

 

<filter>는 웹컨테이너에 필터를 등록하는 역할을 하고 <filter-mapping>은 그 필터를 어느 웹 컴포넌트에 적용시킬 것인지 지정하는 역할을 합니다.

 

web.xml

package myfilter;

 

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;

 

public class SimpleFilter implements Filter{

 

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

 

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        System.out.println("웹컴포넌트 시작");

        chain.doFilter(request, response);//필터체인

        System.out.println("웹컴포넌트 완료");

        

    }

 

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

 

}

 

 

다음은 필터 클래스를 테스트하기 위한 jsp 파일입니다.

 

Simple.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<% System.out.println("jsp 페이지 출력"); %>

<!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=EUC-KR">

<title>Insert title here</title>

</head>

<body>

    필터 테스트

</body>

</html>

 

 

실행 화면

콘솔창을 보면 다음과 같이 출력됨을 알 수 있습니다.

즉, 필터를 거쳐서 웹컴포넌트가 실행되고 다시 필터로 오는 것을 확인할 수 있습니다.

 

만약 다음과 같이 서블릿을 작성해서 필터를 테스트하고 싶다면?

 

/WEB-INF/classes/myservlet/SimpleServlet.java

package myservlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class SimpleServlet extends HttpServlet{

      

    

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        // TODO Auto-generated method stub

        System.out.println("서블릿에서 출력");

        resp.setContentType("text/html;charset=euc-kr");

        PrintWriter out = resp.getWriter();

        out.println("<HTML>");

        out.println("<HEAD><TITLE>필터 테스트용 서블릿</TITLE></HEAD>");

        out.println("<BODY>");

        out.println("필터테스트");

        out.println("</BODY>");

        out.println("</HTML>");

    }

 

}

 

 

서블릿에서 테스트를 하고 싶다면?

서블릿에서도 필터를 적용할 수 있게 <url-pattern>서브엘리먼트의 내용을 기존의 *.jsp에서 /*로 바꿔줘야 적용됩니다.

web.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

<display-name>ch11_jsp_filter</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

    <filter>

     <filter-name>simple-filter</filter-name>

     <filter-class>myfilter.SimpleFilter</filter-class>

    </filter>

    <filter-mapping>

     <filter-name>simple-filter</filter-name>

     <url-pattern>/*</url-pattern>

    </filter-mapping>

    <servlet>

     <servlet-name>simple-servlet</servlet-name>

     <servlet-class>myservlet.SimpleServlet</servlet-class>

    </servlet>

    <servlet-mapping>

     <servlet-name>simple-servlet</servlet-name>

     <url-pattern>/simple</url-pattern>

    </servlet-mapping>

</web-app>

 

실행 화면

콘솔창을 확인하면 처음 jsp에서 테스트했을 때랑 동일한 결과가 나옴을 확인할 수 있습니다.

 

 

반응형