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 |