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 _servlet24Dispatcher = filterConfig.getInitParameter(
54 "servlet-2.4-dispatcher");
55 }
56
57 public void doFilter(
58 ServletRequest servletRequest, ServletResponse servletResponse,
59 FilterChain filterChain)
60 throws IOException, ServletException {
61
62 Log log = getLog();
63
64 if (log.isDebugEnabled()) {
65 if (isFilterEnabled()) {
66 log.debug(_filterClass + " is enabled");
67 }
68 else {
69 log.debug(_filterClass + " is disabled");
70 }
71 }
72
73 HttpServletRequest request = (HttpServletRequest)servletRequest;
74 HttpServletResponse response = (HttpServletResponse)servletResponse;
75
76 boolean filterEnabled = isFilterEnabled();
77
78 if (filterEnabled && Validator.isNotNull(_servlet24Dispatcher)) {
79 if ((_servlet24Dispatcher.equalsIgnoreCase(
80 _SERVLET_24_DISPATCHER_REQUEST)) &&
81 (request.getRequestURL() == null)) {
82
83 filterEnabled = false;
84 }
85 }
86
87 if (filterEnabled && (_urlRegexPattern != null)) {
88 StringBuilder sb = new StringBuilder();
89
90 sb.append(request.getRequestURL());
91
92 if (Validator.isNotNull(request.getQueryString())) {
93 sb.append(StringPool.QUESTION);
94 sb.append(request.getQueryString());
95 }
96
97 Matcher matcher = _urlRegexPattern.matcher(sb.toString());
98
99 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 log.debug(
185 "[" + threadName + "]" + depther + "< " +
186 filterClass.getName() + " " + path + " " +
187 (endTime - startTime) + " ms");
188
189 if (depther.length() > 0) {
190 depther = depther.substring(1);
191 }
192
193 request.setAttribute(_DEPTHER, depther);
194 }
195 }
196
197 private static final String _DEPTHER = "DEPTHER";
198
199 private static final String _SERVLET_24_DISPATCHER_REQUEST = "REQUEST";
200
201 private FilterConfig _filterConfig;
202 private Class<?> _filterClass = getClass();
203 private boolean _filterEnabled = true;
204 private String _servlet24Dispatcher;
205 private Pattern _urlRegexPattern;
206
207 }