/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.servlet.filters.header;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.SetUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Time;
import com.liferay.portal.kernel.util.TimeZoneUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.servlet.filters.BasePortalFilter;
import com.liferay.portal.util.PropsValues;
import java.text.Format;
import java.util.Enumeration;
import java.util.Set;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @author Brian Wing Shun Chan
* @author Raymond Augé
* @author Eduardo Lundgren
*/
public class HeaderFilter extends BasePortalFilter {
protected long getLastModified(HttpServletRequest request) {
String value = HttpUtil.getParameter(request.getQueryString(), "t");
if (Validator.isNull(value)) {
return -1;
}
return GetterUtil.getLong(value);
}
@Override
protected void processFilter(
HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain)
throws Exception {
FilterConfig filterConfig = getFilterConfig();
Enumeration<String> enu = filterConfig.getInitParameterNames();
while (enu.hasMoreElements()) {
String name = enu.nextElement();
if (!_requestHeaderIgnoreInitParams.contains(name)) {
_addHeader(
request, response, name,
filterConfig.getInitParameter(name));
}
}
long lastModified = getLastModified(request);
if (lastModified > 0) {
long ifModifiedSince = request.getDateHeader(
HttpHeaders.IF_MODIFIED_SINCE);
response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);
if (lastModified <= ifModifiedSince) {
response.setDateHeader(
HttpHeaders.LAST_MODIFIED, ifModifiedSince);
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
}
processFilter(
HeaderFilter.class.getName(), request, response, filterChain);
}
private void _addHeader(
HttpServletRequest request, HttpServletResponse response, String name,
String value) {
// LEP-5895, LPS-15802, LPS-69908
if (StringUtil.equalsIgnoreCase(name, HttpHeaders.CACHE_CONTROL)) {
if (_isNewSession(request)) {
if (value.contains(HttpHeaders.CACHE_CONTROL_PUBLIC_VALUE)) {
return;
}
if (PropsValues.WEB_SERVER_PROXY_LEGACY_MODE) {
String contextPath = request.getContextPath();
if (contextPath.equals(PortalUtil.getPathContext())) {
return;
}
}
}
}
else if (StringUtil.equalsIgnoreCase(name, HttpHeaders.EXPIRES)) {
if (_isNewSession(request)) {
return;
}
if (Validator.isNumber(value)) {
int seconds = GetterUtil.getInteger(value);
value = _dateFormat.format(
System.currentTimeMillis() + (seconds * Time.SECOND));
}
}
response.addHeader(name, value);
}
private boolean _isNewSession(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if ((session == null) || session.isNew()) {
return true;
}
return false;
}
private static final Format _dateFormat =
FastDateFormatFactoryUtil.getSimpleDateFormat(
Time.RFC822_FORMAT, LocaleUtil.US, TimeZoneUtil.GMT);
private static final Set<String> _requestHeaderIgnoreInitParams =
SetUtil.fromArray(PropsValues.REQUEST_HEADER_IGNORE_INIT_PARAMS);
}