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