728x90
반응형
모든 서블릿 앞단에서 공통적으로 처리해야 할 내용이 있을 경우 필터를 사용해서 해당 내용을 처리할 수 있다.
필터는 자신만의 고유 API가 있으며, 컨테이너가 이 API를 알고 호출해 준다.
해당 API는 init(), destroy(), doFilter()이다.
그리고 호출해야 할 필터는 DD(web.xml)에서 설정하게 된다.
하나의 예제로 필터를 만들어 보면 다음과 같이 할 수 있다.(Head & First 예제)
모든 필터는 Filter 인터페이스를 구현해야 한다.
또한 doFilter()의 인자로 HttpServletRequest, HttpServletResponse가 아니라 ServletRequest, ServletResponse 가 온다는 점도 주의해야 한다.
그리고 필터는 순차적으로 진행될 수 있는데 chain.doFilter를 통해 다음 필터의 doFilter를 호출할 수 있다.
위와 같이 web.xml을 설정하게 되면 기존에 설정한 /ListenTest.do url을 호출하게 되면 BeerRequestFilter.java의 doFilter 메소드가 자동으로 호출되게 된다.
물론 호출 시에는 init() 메소드가 먼저 실행 되게 되고, 마지막에는 destroy() 메소드가 실행 되게 된다.
url-pattern 대신에 servlet-name이 대신 와도 된다.
우선 순위는 url-pattern이 먼저이고, 해당 패턴에 맞는 필터가 모두 실행되고 나서 servlet-name에 맞는 내용이 실행된다.
필터가 여러개일 경우에는 DD(web.xml)에 설정한 순서대로 실행 되며, 실행 과정은 stack에 관련 필터들이 쌓였다가 제거 되는 모습을 상상해 보면 된다.
필터를 클라이언트가 Request 했을 경우 뿐 아니라, 다른 경우에도 실행할 수 있다.
그럴 경우에는 다음과 같이 DD(web.xml)에 적어주면 된다.
기본 값은 REQUEST이며, 그 대신에 INCLUDE, FORWARD, ERROR 를 사용할 수 있다.
선언하는 내용 그대로 include 시, forward시, error 시에 작동한다.
필터는 자신만의 고유 API가 있으며, 컨테이너가 이 API를 알고 호출해 준다.
해당 API는 init(), destroy(), doFilter()이다.
그리고 호출해야 할 필터는 DD(web.xml)에서 설정하게 된다.
하나의 예제로 필터를 만들어 보면 다음과 같이 할 수 있다.(Head & First 예제)
BeerRequestFilter.java
package com.example.web;
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;
public class BeerRequestFilter implements Filter {
private FilterConfig fc;
public void init(FilterConfig config) throws ServletException {
this.fc = config;
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest httpReq = (HttpServletRequest) req;
String name = httpReq.getRemoteUser();
if(name != null) {
fc.getServletContext().log("User " + name + "is updating");
}
chain.doFilter(req, resp);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
package com.example.web;
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;
public class BeerRequestFilter implements Filter {
private FilterConfig fc;
public void init(FilterConfig config) throws ServletException {
this.fc = config;
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest httpReq = (HttpServletRequest) req;
String name = httpReq.getRemoteUser();
if(name != null) {
fc.getServletContext().log("User " + name + "is updating");
}
chain.doFilter(req, resp);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
모든 필터는 Filter 인터페이스를 구현해야 한다.
또한 doFilter()의 인자로 HttpServletRequest, HttpServletResponse가 아니라 ServletRequest, ServletResponse 가 온다는 점도 주의해야 한다.
그리고 필터는 순차적으로 진행될 수 있는데 chain.doFilter를 통해 다음 필터의 doFilter를 호출할 수 있다.
web.xml
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
<security-role-ref>
<role-name>Manager</role-name>
<role-link>Admin</role-link>
</security-role-ref>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
<filter>
<filter-name>BeerRequest</filter-name>
<filter-class>com.example.web.BeerRequestFilter</filter-class>
<init-param>
<param-name>LogFileName</param-name>
<param-value>UserLog.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
<security-role-ref>
<role-name>Manager</role-name>
<role-link>Admin</role-link>
</security-role-ref>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
<filter>
<filter-name>BeerRequest</filter-name>
<filter-class>com.example.web.BeerRequestFilter</filter-class>
<init-param>
<param-name>LogFileName</param-name>
<param-value>UserLog.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
위와 같이 web.xml을 설정하게 되면 기존에 설정한 /ListenTest.do url을 호출하게 되면 BeerRequestFilter.java의 doFilter 메소드가 자동으로 호출되게 된다.
물론 호출 시에는 init() 메소드가 먼저 실행 되게 되고, 마지막에는 destroy() 메소드가 실행 되게 된다.
url-pattern 대신에 servlet-name이 대신 와도 된다.
우선 순위는 url-pattern이 먼저이고, 해당 패턴에 맞는 필터가 모두 실행되고 나서 servlet-name에 맞는 내용이 실행된다.
필터가 여러개일 경우에는 DD(web.xml)에 설정한 순서대로 실행 되며, 실행 과정은 stack에 관련 필터들이 쌓였다가 제거 되는 모습을 상상해 보면 된다.
필터를 클라이언트가 Request 했을 경우 뿐 아니라, 다른 경우에도 실행할 수 있다.
그럴 경우에는 다음과 같이 DD(web.xml)에 적어주면 된다.
<filter>
<filter-name>BeerRequest</filter-name>
<filter-class>com.example.web.BeerRequestFilter</filter-class>
<init-param>
<param-name>LogFileName</param-name>
<param-value>UserLog.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-name>BeerRequest</filter-name>
<filter-class>com.example.web.BeerRequestFilter</filter-class>
<init-param>
<param-name>LogFileName</param-name>
<param-value>UserLog.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
기본 값은 REQUEST이며, 그 대신에 INCLUDE, FORWARD, ERROR 를 사용할 수 있다.
선언하는 내용 그대로 include 시, forward시, error 시에 작동한다.
728x90
반응형
'Java > Servlet & JSP' 카테고리의 다른 글
필터 - RESPONSE (0) | 2009.04.28 |
---|---|
웹 애플리케이션 보안 (4) | 2009.04.10 |
웹 애플리케이션 배포하기 (0) | 2009.04.07 |
부모 자식 태그간의 통신 (0) | 2009.03.26 |
클래식 커스텀 태그 (0) | 2009.03.26 |