package example.filters; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; import java.util.logging.Logger; import java.util.logging.Level; /** * A cut-and-paste template for implementing a Filter that wraps the Response */ public class ExampleResponseFilter implements Filter { private static final Logger log = Logger.getLogger("example.filters.ExampleResponseFilter"); /** * Called once to initialize the Filter. If init() does not * complete successfully (it throws an exception, or takes a really * long time to return), the Filter will not be placed into service. */ public void init(FilterConfig config) throws ServletException { ServletContext app = config.getServletContext(); // an example of getting an init-param String myParam = config.getInitParameter("my-param"); if (log.isLoggable(Level.CONFIG)) log.log(Level.CONFIG,"my-param value is `" + myParam + "'"); } /** * Called by Resin each time a request/response pair is passed * through the chain due to a client request for a resource at the * end of the chain. The FilterChain parameter is used by the * Filter to pass on the request and response to the next Filter in * the chain. */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; // "wrap" the response object. Any filter or servlet or jsp that // follows in the chain will get this response object // instead of the original Response. res = new ExampleResponseWrapper(res); // call the next filter in the chain nextFilter.doFilter(req, res); } /** * Any cleanup for the filter. This will only happen once, right * before the Filter is released by Resin for garbage collection. */ public void destroy() { } /** * This example response wrapper includes all of the methods you * could possibly want to implement. The implementaions here just * call the method in the super class, implement the ones you want * and remove the ones you don't need to change. */ class ExampleResponseWrapper extends HttpServletResponseWrapper { ExampleResponseWrapper(HttpServletResponse response) { super(response); } /** * Sets the HTTP status * * @param sc the HTTP status code */ public void setStatus(int sc) { super.setStatus(sc); } public void setStatus(int sc, String msg) { super.setStatus(sc, msg); } /** * Sends an HTTP error page based on the status code * * @param sc the HTTP status code */ public void sendError(int sc, String msg) throws IOException { super.sendError(sc, msg); } /** * Sends an HTTP error page based on the status code * * @param sc the HTTP status code */ public void sendError(int sc) throws IOException { super.sendError(sc); } /** * Redirects the client to another page. * * @param location the location to redirect to. */ public void sendRedirect(String location) throws IOException { super.sendRedirect(location); } /** * Sets a header. This will override a previous header * with the same name. * * @param name the header name * @param value the header value */ public void setHeader(String name, String value) { super.setHeader(name, value); } /** * Adds a header. If another header with the same name exists, both * will be sent to the client. * * @param name the header name * @param value the header value */ public void addHeader(String name, String value) { super.addHeader(name, value); } /** * Returns true if the output headers include <code>name</code> * * @param name the header name to test */ public boolean containsHeader(String name) { return super.containsHeader(name); } /** * Sets a header by converting a date to a string. * * <p>To set the page to expire in 15 seconds use the following: * <pre><code> * long now = System.currentTime(); * response.setDateHeader("Expires", now + 15000); * </code></pre> * * @param name name of the header * @param date the date in milliseconds since the epoch. */ public void setDateHeader(String name, long date) { super.setDateHeader(name, date); } /** * Adds a header by converting a date to a string. * * @param name name of the header * @param date the date in milliseconds since the epoch. */ public void addDateHeader(String name, long date) { super.addDateHeader(name, date); } /** * Sets a header by converting an integer value to a string. * * @param name name of the header * @param value the value as an integer */ public void setIntHeader(String name, int value) { super.setIntHeader(name, value); } /** * Adds a header by converting an integer value to a string. * * @param name name of the header * @param value the value as an integer */ public void addIntHeader(String name, int value) { super.addIntHeader(name, value); } /** * Sends a new cookie to the client. */ public void addCookie(Cookie cookie) { super.addCookie(cookie); } /** * Encodes session information in a URL. Calling this will enable * sessions for users who have disabled cookies. * * @param url the url to encode * @return a url with session information encoded */ public String encodeURL(String url) { return super.encodeURL(url); } /** * Encodes session information in a URL suitable for * <code>sendRedirect()</code> * * @param url the url to encode * @return a url with session information encoded */ public String encodeRedirectURL(String name) { return super.encodeRedirectURL(name); } } }