/*
* The MIT License
*
* Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:digerata
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson;
import java.util.*;
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 java.io.IOException;
/**
* This filter allows you to modify headers set by the container or other servlets
* that are out of your control. The particular headers you wish to change are configured
* in web.xml.
* <p>
* One particular header you you may wish to deal with is "Cache-Control: no-cache"
* This is a problem with Tomcat when security is used. Continue reading for further details.
* <p>
* If a web app has a <security-constraint> in its web.xml, Tomcat will
* add a Cache-Control header to every file it serves from that location. This
* header will prevent browsers from caching the file locally and this drastically slows
* down Hudson page load times.
* <p>
* To enable this filter, edit the web.xml file to include:
*
* <pre>
* <filter>
* <filter-name>change-headers-filter</filter-name>
* <filter-class>hudson.ResponseHeaderFilter</filter-class>
* <init-param>
* <param-name>Pragma</param-name>
* <param-value>public</param-value>
* </init-param>
* <init-param>
* <param-name>Cache-Control</param-name>
* <param-value>max-age=86400, public</param-value>
* </init-param>
* </filter>
*
* And down below that:
*
* <filter-mapping>
* <filter-name>Headers</filter-name>
* <url-pattern>/*</url-pattern>
* </filter-mapping>
* </pre>
*
* <p>
* In the case of the tomcat cache problem, it is important that the url-pattern for
* the filter matches the url-pattern set for the security-constraint.
*
* @author Mike Wille
*/
public class ResponseHeaderFilter implements Filter {
private FilterConfig config;
public void init(FilterConfig filterConfig) throws ServletException {
config = filterConfig;
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
ServletException {
HttpServletResponse httpResp = (HttpServletResponse) resp;
Enumeration e = config.getInitParameterNames();
// for each configuration element...
while(e.hasMoreElements()) {
String headerName = (String) e.nextElement();
String headerValue = config.getInitParameter(headerName);
// set the header with the given name and value
httpResp.setHeader(headerName, headerValue);
}
chain.doFilter(req, resp);
}
public void destroy() {
}
}