본문 바로가기

JSP/Learn

[servlet] 서블릿 필터


리스너와 함께 대표적인 특별한 형태의 서블릿

사용자 요청에 따라 특정 서블릿이나 JSP가 실행되기전 사전 작업 수행한다.


여러 개의 서블릿을 다양한 조건으로 설정해 하나의 요청에 여러 필터가 사전에 수행 될 수 있도록 할 수 있음



동작구조는 다음과 같다.

1. web.xml에 명시된 Filter의 url-pattern에 맞는 요청이 들어옴.

2. 해당요청에 따른 ServletFilter가 먼저 실행

3. 본래 요청한 페이지로


밑은 간단한 서블릿 필터 예제.



FilterTest.java

public class FileterTest implements Filter {

    public FileterTest() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 이곳에 사전처리 작업이 들어간다.
		request.setCharacterEncoding("utf-8");
		request.setAttribute("filter", "나는 필터입니다");
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {
	}

}



FilterTester.java

public class FilterTester extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public FilterTester() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out =response.getWriter();
		
		String tester = (String)request.getAttribute("filter");
		
		out.println("필터에서 넘어온 값 : " + tester);
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

}



web.xml 부분


 <servlet>

    <description></description>

    <display-name>FilterTester</display-name>

    <servlet-name>FilterTester</servlet-name>

    <servlet-class>ex.FilterTester</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>FilterTester</servlet-name>

    <url-pattern>/FilterTester</url-pattern>

  </servlet-mapping>

  

  <filter>

    <display-name>FileterTest</display-name>

    <filter-name>FileterTest</filter-name>

    <filter-class>ex.FileterTest</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>FileterTest</filter-name>

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

  </filter-mapping>



결과




위의 예제에서는 모든 주소에 대하여 Filter가 처리된다.