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;
}