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