import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
Filter implements Intercepting Filter pattern
Wrappers implement decorator pattern
You can use filters to intercept requests before they go to a servlet
or intercept response after they return from a servlet.
Filters can be chained
Servlet is unaware of filters.
They are declared in DD for a specific URL or servlet
Request filters can:
  perform security checks
  reformat request headers or bodies
  audit or log requests
Response filters can:
  compress the response stream
  append or alter the response stream
  create a different response altogether
 
implement Filter interface for both Request and Response filter
  must implement
   init(FilterConfig),
   doFilter(ServletRequest, ServReponse, FilterChain),
   destroy() methods
FilterChain will forward based on DD
 */
public class MyFilter implements Filter  {
  public MyFilter() {  }
 
  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }
 
  // callback and inline method
  public void doFilter( ServletRequest request,
                        ServletResponse response,
                        FilterChain chain)
       throws ServletException, IOException  {
    System.out.println("@@@@@ MyRequestFilter.doFilter ");
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    String name = httpRequest.getRemoteUser();
    if (name != null) System.out.println("Filter name: " + name);
    MyResponseWrapper respWrapper = new MyResponseWrapper(httpResponse);
    chain.doFilter(request, respWrapper); // forward to next filter or servlet
    // do response filtering here, note that ouptut goes directly to client
  }
 
  public void destroy() {}
 
  private FilterConfig config;
}

/**
Usage of Decorator pattern
Since Reponse output goes directly back, we need to use wrapper
ServletRequestWrapper, ServletResponseWrapper
HttServletRequestWrapper, HttpServletResponseWrapper

 */
class MyResponseWrapper extends HttpServletResponseWrapper {
 
  MyResponseWrapper(HttpServletResponse response) {
    super(response);
    this.response = response;
  }
  public ServletOutputStream getOutputStream() throws IOException {
    // We can create our own Output Stream here for e.g
    return response.getOutputStream();
  }
 
  private HttpServletResponse response;
}
Hosted by www.Geocities.ws

1