1
14
15 package com.liferay.portal.kernel.servlet;
16
17 import com.liferay.portal.kernel.log.Log;
18 import com.liferay.portal.kernel.util.GetterUtil;
19 import com.liferay.portal.kernel.util.StringPool;
20 import com.liferay.portal.kernel.util.Validator;
21
22 import java.io.IOException;
23
24 import java.util.regex.Matcher;
25 import java.util.regex.Pattern;
26
27 import javax.servlet.Filter;
28 import javax.servlet.FilterChain;
29 import javax.servlet.FilterConfig;
30 import javax.servlet.ServletException;
31 import javax.servlet.ServletRequest;
32 import javax.servlet.ServletResponse;
33 import javax.servlet.http.HttpServletRequest;
34 import javax.servlet.http.HttpServletResponse;
35
36
42 public abstract class BaseFilter implements Filter {
43
44 public void init(FilterConfig filterConfig) {
45 _filterConfig = filterConfig;
46
47 String urlRegexPattern = GetterUtil.getString(
48 filterConfig.getInitParameter("url-regex-pattern"));
49
50 if (Validator.isNotNull(urlRegexPattern)) {
51 _urlRegexPattern = Pattern.compile(urlRegexPattern);
52 }
53
54 String urlRegexIgnorePattern = GetterUtil.getString(
55 filterConfig.getInitParameter("url-regex-ignore-pattern"));
56
57 if (Validator.isNotNull(urlRegexIgnorePattern)) {
58 _urlRegexIgnorePattern = Pattern.compile(urlRegexIgnorePattern);
59 }
60
61 String servlet24Dispatcher = GetterUtil.getString(
62 filterConfig.getInitParameter("servlet-2.4-dispatcher"));
63
64 if (servlet24Dispatcher.equalsIgnoreCase(
65 _SERVLET_24_DISPATCHER_REQUEST)) {
66
67 _servlet24Dispatcher = true;
68 }
69 }
70
71 public void doFilter(
72 ServletRequest servletRequest, ServletResponse servletResponse,
73 FilterChain filterChain)
74 throws IOException, ServletException {
75
76 Log log = getLog();
77
78 if (log.isDebugEnabled()) {
79 if (isFilterEnabled()) {
80 log.debug(_filterClass + " is enabled");
81 }
82 else {
83 log.debug(_filterClass + " is disabled");
84 }
85 }
86
87 HttpServletRequest request = (HttpServletRequest)servletRequest;
88 HttpServletResponse response = (HttpServletResponse)servletResponse;
89
90 StringBuffer requestURL = request.getRequestURL();
91
92 boolean filterEnabled = isFilterEnabled();
93
94 if (filterEnabled && _servlet24Dispatcher && (requestURL == null)) {
95 filterEnabled = false;
96 }
97
98 if (filterEnabled &&
99 ((_urlRegexPattern != null) ||
100 (_urlRegexIgnorePattern != null))) {
101
102 String url = requestURL.toString();
103
104 String queryString = request.getQueryString();
105
106 if (Validator.isNotNull(queryString)) {
107 url = url.concat(StringPool.QUESTION).concat(queryString);
108 }
109
110 if (_urlRegexPattern != null) {
111 Matcher matcher = _urlRegexPattern.matcher(url);
112
113 filterEnabled = matcher.find();
114 }
115
116 if (filterEnabled && (_urlRegexIgnorePattern != null)) {
117 Matcher matcher = _urlRegexIgnorePattern.matcher(url);
118
119 filterEnabled = !matcher.find();
120 }
121 }
122
123 try {
124 if (filterEnabled) {
125 processFilter(request, response, filterChain);
126 }
127 else {
128 processFilter(_filterClass, request, response, filterChain);
129 }
130 }
131 catch (IOException ioe) {
132 throw ioe;
133 }
134 catch (ServletException se) {
135 throw se;
136 }
137 catch (Exception e) {
138 getLog().error(e, e);
139 }
140 }
141
142 public FilterConfig getFilterConfig() {
143 return _filterConfig;
144 }
145
146 public void destroy() {
147 }
148
149 protected abstract Log getLog();
150
151 protected boolean isFilterEnabled() {
152 return _filterEnabled;
153 }
154
155 protected abstract void processFilter(
156 HttpServletRequest request, HttpServletResponse response,
157 FilterChain filterChain)
158 throws Exception;
159
160 protected void processFilter(
161 Class<?> filterClass, HttpServletRequest request,
162 HttpServletResponse response, FilterChain filterChain)
163 throws Exception {
164
165 long startTime = 0;
166
167 String threadName = null;
168 String depther = null;
169 String path = null;
170
171 Log log = getLog();
172
173 if (log.isDebugEnabled()) {
174 startTime = System.currentTimeMillis();
175
176 Thread currentThread = Thread.currentThread();
177
178 threadName = currentThread.getName();
179
180 depther = (String)request.getAttribute(_DEPTHER);
181
182 if (depther == null) {
183 depther = StringPool.BLANK;
184 }
185 else {
186 depther += StringPool.EQUAL;
187 }
188
189 request.setAttribute(_DEPTHER, depther);
190
191 path = request.getRequestURI();
192
193 log.debug(
194 "[" + threadName + "]" + depther + "> " +
195 filterClass.getName() + " " + path);
196 }
197
198 filterChain.doFilter(request, response);
199
200 if (log.isDebugEnabled()) {
201 long endTime = System.currentTimeMillis();
202
203 depther = (String)request.getAttribute(_DEPTHER);
204
205 if (depther == null) {
206 return;
207 }
208
209 log.debug(
210 "[" + threadName + "]" + depther + "< " +
211 filterClass.getName() + " " + path + " " +
212 (endTime - startTime) + " ms");
213
214 if (depther.length() > 0) {
215 depther = depther.substring(1);
216 }
217
218 request.setAttribute(_DEPTHER, depther);
219 }
220 }
221
222 private static final String _DEPTHER = "DEPTHER";
223
224 private static final String _SERVLET_24_DISPATCHER_REQUEST = "REQUEST";
225
226 private FilterConfig _filterConfig;
227 private Class<?> _filterClass = getClass();
228 private boolean _filterEnabled = true;
229 private boolean _servlet24Dispatcher;
230 private Pattern _urlRegexIgnorePattern;
231 private Pattern _urlRegexPattern;
232
233 }