001
014
015 package com.liferay.portal.kernel.servlet;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.util.GetterUtil;
019 import com.liferay.portal.kernel.util.StringPool;
020 import com.liferay.portal.kernel.util.Validator;
021
022 import java.io.IOException;
023
024 import java.util.regex.Matcher;
025 import java.util.regex.Pattern;
026
027 import javax.servlet.Filter;
028 import javax.servlet.FilterChain;
029 import javax.servlet.FilterConfig;
030 import javax.servlet.ServletException;
031 import javax.servlet.ServletRequest;
032 import javax.servlet.ServletResponse;
033 import javax.servlet.http.HttpServletRequest;
034 import javax.servlet.http.HttpServletResponse;
035
036
040 public abstract class BaseFilter implements Filter {
041
042 public void init(FilterConfig filterConfig) {
043 _filterConfig = filterConfig;
044
045 String urlRegexPattern = GetterUtil.getString(
046 filterConfig.getInitParameter("url-regex-pattern"));
047
048 if (Validator.isNotNull(urlRegexPattern)) {
049 _urlRegexPattern = Pattern.compile(urlRegexPattern);
050 }
051
052 String urlRegexIgnorePattern = GetterUtil.getString(
053 filterConfig.getInitParameter("url-regex-ignore-pattern"));
054
055 if (Validator.isNotNull(urlRegexIgnorePattern)) {
056 _urlRegexIgnorePattern = Pattern.compile(urlRegexIgnorePattern);
057 }
058
059 String servlet24Dispatcher = GetterUtil.getString(
060 filterConfig.getInitParameter("servlet-2.4-dispatcher"));
061
062 if (servlet24Dispatcher.equalsIgnoreCase(
063 _SERVLET_24_DISPATCHER_REQUEST)) {
064
065 _servlet24Dispatcher = true;
066 }
067 }
068
069 public void doFilter(
070 ServletRequest servletRequest, ServletResponse servletResponse,
071 FilterChain filterChain)
072 throws IOException, ServletException {
073
074 Log log = getLog();
075
076 if (log.isDebugEnabled()) {
077 if (isFilterEnabled()) {
078 log.debug(_filterClass + " is enabled");
079 }
080 else {
081 log.debug(_filterClass + " is disabled");
082 }
083 }
084
085 HttpServletRequest request = (HttpServletRequest)servletRequest;
086 HttpServletResponse response = (HttpServletResponse)servletResponse;
087
088 StringBuffer requestURL = request.getRequestURL();
089
090 boolean filterEnabled = isFilterEnabled();
091
092 if (filterEnabled && _servlet24Dispatcher && (requestURL == null)) {
093 filterEnabled = false;
094 }
095
096 if (filterEnabled &&
097 ((_urlRegexPattern != null) ||
098 (_urlRegexIgnorePattern != null))) {
099
100 String url = requestURL.toString();
101
102 String queryString = request.getQueryString();
103
104 if (Validator.isNotNull(queryString)) {
105 url = url.concat(StringPool.QUESTION).concat(queryString);
106 }
107
108 if (_urlRegexPattern != null) {
109 Matcher matcher = _urlRegexPattern.matcher(url);
110
111 filterEnabled = matcher.find();
112 }
113
114 if (filterEnabled && (_urlRegexIgnorePattern != null)) {
115 Matcher matcher = _urlRegexIgnorePattern.matcher(url);
116
117 filterEnabled = !matcher.find();
118 }
119 }
120
121 try {
122 if (filterEnabled) {
123 processFilter(request, response, filterChain);
124 }
125 else {
126 processFilter(_filterClass, request, response, filterChain);
127 }
128 }
129 catch (IOException ioe) {
130 throw ioe;
131 }
132 catch (ServletException se) {
133 throw se;
134 }
135 catch (Exception e) {
136 getLog().error(e, e);
137 }
138 }
139
140 public FilterConfig getFilterConfig() {
141 return _filterConfig;
142 }
143
144 public void destroy() {
145 }
146
147 protected abstract Log getLog();
148
149 protected boolean isFilterEnabled() {
150 return _filterEnabled;
151 }
152
153 protected abstract void processFilter(
154 HttpServletRequest request, HttpServletResponse response,
155 FilterChain filterChain)
156 throws Exception;
157
158 protected void processFilter(
159 Class<?> filterClass, HttpServletRequest request,
160 HttpServletResponse response, FilterChain filterChain)
161 throws Exception {
162
163 long startTime = 0;
164
165 String threadName = null;
166 String depther = null;
167 String path = null;
168
169 Log log = getLog();
170
171 if (log.isDebugEnabled()) {
172 startTime = System.currentTimeMillis();
173
174 Thread currentThread = Thread.currentThread();
175
176 threadName = currentThread.getName();
177
178 depther = (String)request.getAttribute(_DEPTHER);
179
180 if (depther == null) {
181 depther = StringPool.BLANK;
182 }
183 else {
184 depther += StringPool.EQUAL;
185 }
186
187 request.setAttribute(_DEPTHER, depther);
188
189 path = request.getRequestURI();
190
191 log.debug(
192 "[" + threadName + "]" + depther + "> " +
193 filterClass.getName() + " " + path);
194 }
195
196 filterChain.doFilter(request, response);
197
198 if (log.isDebugEnabled()) {
199 long endTime = System.currentTimeMillis();
200
201 depther = (String)request.getAttribute(_DEPTHER);
202
203 if (depther == null) {
204 return;
205 }
206
207 log.debug(
208 "[" + threadName + "]" + depther + "< " +
209 filterClass.getName() + " " + path + " " +
210 (endTime - startTime) + " ms");
211
212 if (depther.length() > 0) {
213 depther = depther.substring(1);
214 }
215
216 request.setAttribute(_DEPTHER, depther);
217 }
218 }
219
220 private static final String _DEPTHER = "DEPTHER";
221
222 private static final String _SERVLET_24_DISPATCHER_REQUEST = "REQUEST";
223
224 private FilterConfig _filterConfig;
225 private Class<?> _filterClass = getClass();
226 private boolean _filterEnabled = true;
227 private boolean _servlet24Dispatcher;
228 private Pattern _urlRegexIgnorePattern;
229 private Pattern _urlRegexPattern;
230
231 }