001
014
015 package com.liferay.portal.servlet.filters.header;
016
017 import com.liferay.portal.kernel.servlet.HttpHeaders;
018 import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
019 import com.liferay.portal.kernel.util.GetterUtil;
020 import com.liferay.portal.kernel.util.HttpUtil;
021 import com.liferay.portal.kernel.util.SetUtil;
022 import com.liferay.portal.kernel.util.TimeZoneUtil;
023 import com.liferay.portal.kernel.util.Validator;
024 import com.liferay.portal.servlet.filters.BasePortalFilter;
025 import com.liferay.portal.util.PortalUtil;
026 import com.liferay.portal.util.PropsValues;
027
028 import java.text.Format;
029
030 import java.util.Calendar;
031 import java.util.Enumeration;
032 import java.util.GregorianCalendar;
033 import java.util.Locale;
034 import java.util.Map;
035 import java.util.Set;
036
037 import javax.servlet.FilterChain;
038 import javax.servlet.FilterConfig;
039 import javax.servlet.http.HttpServletRequest;
040 import javax.servlet.http.HttpServletResponse;
041 import javax.servlet.http.HttpSession;
042
043
048 public class HeaderFilter extends BasePortalFilter {
049
050 @Override
051 public void init(FilterConfig filterConfig) {
052 super.init(filterConfig);
053
054 _filterConfig = filterConfig;
055 _dateFormat = FastDateFormatFactoryUtil.getSimpleDateFormat(
056 _DATE_FORMAT, Locale.US, TimeZoneUtil.getTimeZone(_TIME_ZONE));
057 }
058
059 protected long getLastModified(HttpServletRequest request) {
060 long lasModified = -1;
061
062 Map<String, String[]> parameterMap = HttpUtil.getParameterMap(
063 request.getQueryString());
064
065 String[] value = parameterMap.get("t");
066
067 if ((value != null) && (value.length > 0)) {
068 lasModified = GetterUtil.getLong(value[0]);
069 }
070
071 return lasModified;
072 }
073
074 @Override
075 protected void processFilter(
076 HttpServletRequest request, HttpServletResponse response,
077 FilterChain filterChain)
078 throws Exception {
079
080 Enumeration<String> enu = _filterConfig.getInitParameterNames();
081
082 while (enu.hasMoreElements()) {
083 String name = enu.nextElement();
084
085 if (_requestHeaderIgnoreInitParams.contains(name)) {
086 continue;
087 }
088
089 String value = _filterConfig.getInitParameter(name);
090
091 if (name.equals(_EXPIRES) && Validator.isNumber(value)) {
092 int seconds = GetterUtil.getInteger(value);
093
094 Calendar cal = new GregorianCalendar();
095
096 cal.add(Calendar.SECOND, seconds);
097
098 value = _dateFormat.format(cal.getTime());
099 }
100
101
102
103 boolean addHeader = true;
104
105 if (name.equalsIgnoreCase(HttpHeaders.CACHE_CONTROL) ||
106 name.equalsIgnoreCase(HttpHeaders.EXPIRES)) {
107
108 boolean newSession = false;
109
110 HttpSession session = request.getSession(false);
111
112 if ((session == null) || session.isNew()) {
113 newSession = true;
114 }
115
116 String contextPath = request.getContextPath();
117
118 if (name.equalsIgnoreCase(HttpHeaders.EXPIRES) && newSession) {
119 addHeader = false;
120 }
121 else if (PropsValues.WEB_SERVER_PROXY_LEGACY_MODE &&
122 newSession &&
123 contextPath.equals(PortalUtil.getPathContext())) {
124
125 addHeader = false;
126 }
127 }
128
129 if (addHeader) {
130 response.addHeader(name, value);
131 }
132 }
133
134 long lastModified = getLastModified(request);
135 long ifModifiedSince = request.getDateHeader(
136 HttpHeaders.IF_MODIFIED_SINCE);
137
138 if (lastModified > 0) {
139 response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);
140
141 if (lastModified <= ifModifiedSince) {
142 response.setDateHeader(
143 HttpHeaders.LAST_MODIFIED, ifModifiedSince);
144 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
145
146 return;
147 }
148 }
149
150 processFilter(HeaderFilter.class, request, response, filterChain);
151 }
152
153 private static final String _DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z";
154
155 private static final String _EXPIRES = "Expires";
156
157 private static final String _TIME_ZONE = "GMT";
158
159 private static Set<String> _requestHeaderIgnoreInitParams =
160 SetUtil.fromArray(PropsValues.REQUEST_HEADER_IGNORE_INIT_PARAMS);
161
162 private Format _dateFormat;
163 private FilterConfig _filterConfig;
164
165 }