Servlet 필터

서블릿 2.3버전에 추가된 것으로클라이언트의 요청을 서블릿이 받기 전에 가로채어 필터에 작성된 내용을 수행하는 것을 말한다따라서필터를 사용하면 클라이언트의 요청을 가로채서 서버 컴포넌트의 추가기능을 수행하도록 할수 있다.


             

   

  

서블릿 필터 코드의 기본 구성은 다음과 같다.

  

 

public class SampleFilter implements Filter {

 

       @Override

       public void init(FilterConfig filterConfig) throws ServletException {

              … … …

       }

 

       @Override

       public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 

           throws IOException, ServletException {

 

              필터가 수행되기전 >

              chain.doFilter(req, res);

              필터가 수행되기전 >

       }

 

       @Override

       public void destroy() {

              … … …

       }

}

 

 

 

 

Filter에서 Request가로채서 가공하기

다음은 Request 파라미터의 값이 존재하지 않는경우 서블릿필터의 초기화 값으로 선언된 값을 읽어 기본 값으로 설정하는 기능이다.

package ch15;

 

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;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

 

public class RequestDefaultsFilter implements Filter {

       FilterConfig filterConfig;

 

       @Override

       public void init(FilterConfig filterConfig) throws ServletException {

              this.filterConfig = filterConfig;

       }

 

       @Override

       public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,

                     ServletException {

              WrappedRequest wrappedRequest = new WrappedRequest((HttpServletRequest) req);

              chain.doFilter(wrappedRequest, res);

       }

 

       @Override

       public void destroy() {

       }

 

       class WrappedRequest extends HttpServletRequestWrapper {

              WrappedRequest(HttpServletRequest req) {

                     super(req);

              }

 

              public String getParameter(String name) {

                     String value = super.getParameter(name);

                     if (value == null)

                           value = filterConfig.getInitParameter(name);

                     return value;

              }

       }

 

}

 

 

   

 

Filter에서 Resonse가로채서 가공하기

 

Response 가로채서 사용자에게 응답페이지를 보여지기 전에 오류가 발생한 경우 sendError()메소드를 Override하여 공통적으로 적용할 내용을 보여줄수 있는등 유용한 관리 포인트가 될수 있다.

다음의 코드는 Response 가로채서 마임타입이 text/html 경우 Filter 초기화 변수들을 읽어들여 Link 형태로 Replace해주는 기능이다.

 

 

package ch15;

 

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.io.Writer;

import java.util.Enumeration;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

 

public class LinkResponseFilter implements Filter {

       FilterConfig filterConfig;

 

       @Override

       public void init(FilterConfig filterConfig) throws ServletException {

              this.filterConfig = filterConfig;

       }

 

       @Override

       public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,

              ServletException {


              WrappedResponse wrappedResponse = new WrappedResponse((HttpServletResponse) res);

              chain.doFilter(req, wrappedResponse);

              wrappedResponse.close();

       }

 

       @Override

       public void destroy() {

       }

 

       class WrappedResponse extends HttpServletResponseWrapper {

              boolean linkText;

              PrintWriter client;

 

              WrappedResponse(HttpServletResponse res) {

                     super(res);

              }

 

              public void setContentType(String mime) {

                     super.setContentType(mime);

                     if (mime.startsWith("text/html")) linkText = true;

              }

 

              public PrintWriter getWriter() throws IOException {

                     if (client == null

                           if (linkText) client = new LinkWriter(super.getWriter(), new ByteArrayOutputStream());

                     else

                           client = super.getWriter();

                     return client;

              }

 

              void close() {

                     if (client != null) client.close();

              }

       }

 

       class LinkWriter extends PrintWriter {

              ByteArrayOutputStream buffer;

              Writer client;

 

              LinkWriter(Writer client, ByteArrayOutputStream buffer) {

                     super(buffer);

                     this.buffer = buffer;

                     this.client = client;

              }

 

              public void close() {

                     try {

                           flush();

                           client.write(linkText(buffer.toString()));

                           client.close();

                     } catch (IOException e) {

                           setError();

                     }

              }

 

              String linkText(String text) {

                     Enumeration en = filterConfig.getInitParameterNames();

                     while (en.hasMoreElements()) {

                           String pattern = (String) en.nextElement();

                           String value = filterConfig.getInitParameter(pattern);

                           text = text.replaceAll(pattern, "<a href=" + value + ">$0</a>");

                     }

                     return text;

              }

       }

}

 



Servlet 필터 설정

 

    <filter>

        <filter-name>ResponseFilter</filter-name>

        <filter-class>ch15.LinkResponseFilter </filter-class>

        <!-- 'encoding'라는 파라미값을 읽으려고 할때 값이 없는 경우 'UTF-8'으로 설정한다. -->

        <init-param>

            <param-name>encoding</param-name>

            <param-value>UTF-8</param-value>

        </init-param>

        <!-- 'greeting'라는 파라미값을 읽으려고 할때 값이 없는 경우 'Ahn Nyung~'으로 설정한다. -->

        <init-param>

            <param-name>greeting</param-name>

            <param-value>Ahn Nyung~</param-value>

        </init-param>       

    </filter>

    <filter>

        <filter-name>LinkResponseFilter </filter-name>

        <filter-class>ch15.LinkResponseFilter</filter-class>

    </filter>

 

 

    <filter-mapping>

        <filter-name>ResponseFilter</filter-name>

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

    </filter-mapping>

    <filter-mapping>

        <filter-name>LinkResponseFilter</filter-name>

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

    </filter-mapping>

 

 

'Java > Java for the Web' 카테고리의 다른 글

Web-Service Sample  (0) 2013.11.16
GET과 POST 예제프로그램, (URL클래스를 이용한 웹컨텐츠 StreamData 읽기)  (0) 2013.11.15
A Simple Filter  (0) 2013.02.12
Cookie정보 보기  (0) 2013.02.12
Session정보 보기  (0) 2013.02.12
Posted by Steven J.S Min
,