/* * Carrot2 project. * * Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński. * All rights reserved. * * Refer to the full license file "carrot2.LICENSE" * in the root folder of the repository checkout or at: * http://www.carrot2.org/carrot2.LICENSE */ package org.carrot2.webapp.filter; import java.io.IOException; import java.util.Calendar; import java.util.regex.Pattern; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * A filter that sets a far future expires header, by default 10 years ahead. */ public class FarFutureExpiresHeaderFilter implements Filter { /** Init parameter name for the expires offset. */ static final String EXPIRES_OFFSET_YEARS_PARAMETER_NAME = "expires-offset-years"; /** The number of years to add to current date for the Expires header. */ private static final int EXPIRES_OFFSET_YEARS_DEFAULT = 10; /** The expires offset to be used */ private int expiresOffsetYears = EXPIRES_OFFSET_YEARS_DEFAULT; /** Init parameter name for the expires exclude regexp. */ static final String USER_AGENT_EXCLUDE_REGEXP_PARAMETER_NAME = "user-agent-exclude"; /** * The regexp matched against the User Agent field that can exclude some requests from * processing. */ private static final Pattern USER_AGENT_EXCLUDE_REGEXP_DEFAULT = null; /** The expires offset to be used */ private Pattern userAgentExclude = USER_AGENT_EXCLUDE_REGEXP_DEFAULT; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Act only on HTTP requests and responses if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) { final HttpServletRequest httpRequest = (HttpServletRequest) request; final String userAgentString = httpRequest.getHeader("User-Agent"); if (userAgentExclude == null || userAgentString == null || !userAgentExclude.matcher(userAgentString).find()) { final HttpServletResponse httpResponse = (HttpServletResponse) response; final Calendar expiresCalendar = Calendar.getInstance(); expiresCalendar.add(Calendar.YEAR, expiresOffsetYears); httpResponse.addDateHeader("Expires", expiresCalendar.getTimeInMillis()); } } chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { final String expiresOffsetString = filterConfig .getInitParameter(EXPIRES_OFFSET_YEARS_PARAMETER_NAME); if (expiresOffsetString != null) { expiresOffsetYears = Integer.parseInt(expiresOffsetString); } final String userAgentExcludeRegexpString = filterConfig .getInitParameter(USER_AGENT_EXCLUDE_REGEXP_PARAMETER_NAME); if (userAgentExcludeRegexpString != null) { userAgentExclude = Pattern.compile(userAgentExcludeRegexpString); } } }