/* * Copyright 2006-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jrecruiter.web.filter; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; 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; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Allows for setting HTTP Header * E.g. this is useful for example in order to set the expiration header * of image files (png, gif, jpg etc.) in order to promote client side caching. * * @see http://weblogs.java.net/blog/felipegaucho/archive/2007/08/expires_http_he.html * * @author Gunnar Hillert */ public class ResponseAddHttpHeadersFilter implements Filter { /** Initialize Logging. */ private final static Logger LOGGER = LoggerFactory.getLogger(ResponseAddHttpHeadersFilter.class); FilterConfig config; public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { final HttpServletResponse response; final HttpServletRequest request; if (res instanceof HttpServletResponse) { response = (HttpServletResponse) res; } else { throw new IllegalStateException("Cannot cast ServletResponse to HttpServletResponse."); } if (req instanceof HttpServletRequest) { request = (HttpServletRequest) req; } else { throw new IllegalStateException("Cannot cast ServletRequest to HttpServletRequest."); } LOGGER.debug("RequestURI = " + request.getRequestURI()); final int secondsToCache = Integer.valueOf(config.getInitParameter("secondsToCache")); setCacheExpireDate(response, secondsToCache); // pass the request/response on chain.doFilter(req, response); } public void init(FilterConfig filterConfig) { this.config = filterConfig; } public void destroy() { this.config = null; } public static void setCacheExpireDate(final HttpServletResponse response, final int seconds) { if (response != null) { final Calendar cal = new GregorianCalendar(); cal.add(Calendar.SECOND, seconds); response.setHeader("Cache-Control", "PUBLIC, max-age=" + seconds + ", must-revalidate"); response.setHeader("Expires", htmlExpiresDateFormat().format(cal.getTime())); } } public static DateFormat htmlExpiresDateFormat() { final DateFormat httpDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); httpDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); return httpDateFormat; } }