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