1 20 package org.openi.web; 21 22 import com.tonbeller.tbutils.testenv.Environment; 23 import com.tonbeller.wcf.controller.Controller; 24 import com.tonbeller.wcf.controller.MultiPartEnabledRequest; 25 import com.tonbeller.wcf.controller.RequestContext; 26 import com.tonbeller.wcf.controller.RequestContextFactoryFinder; 27 import com.tonbeller.wcf.controller.RequestSynchronizer; 28 import com.tonbeller.wcf.controller.WcfController; 29 import com.tonbeller.wcf.utils.DomUtils; 30 import com.tonbeller.wcf.utils.JDK13Utils; 31 import com.tonbeller.wcf.utils.UrlUtils; 32 import org.apache.log4j.Logger; 33 import org.apache.log4j.MDC; 34 import java.io.IOException ; 35 import java.io.PrintWriter ; 36 import javax.servlet.Filter ; 37 import javax.servlet.FilterChain ; 38 import javax.servlet.FilterConfig ; 39 import javax.servlet.ServletException ; 40 import javax.servlet.ServletRequest ; 41 import javax.servlet.ServletResponse ; 42 import javax.servlet.http.HttpServletRequest ; 43 import javax.servlet.http.HttpServletResponse ; 44 import javax.servlet.http.HttpSession ; 45 import javax.servlet.jsp.jstl.core.Config; 46 47 48 53 public class RequestFilter implements Filter { 54 private static Logger logger = Logger.getLogger(RequestFilter.class); 55 static final String NEXTVIEW = RequestFilter.class.getName() + ".nextview"; 56 static final String ISNEW = RequestFilter.class.getName() + ".isnew"; 57 58 59 public static final String CONTEXT = "context"; 60 61 62 public static final String FORCE_INDEX_JSP = "com.tonbeller.wcf.controller.FORCE_INDEX_JSP"; 63 64 68 public static final String RESET_RANDOM_SEED = "resetRandomSeed"; 69 private String errorJSP = null; 70 private String busyJSP = null; 71 private String indexJSP = null; 72 private String [] passThru = null; 73 private String forceExtension = null; 74 75 public RequestFilter() { 76 } 77 78 public void init(FilterConfig config) throws ServletException { 79 errorJSP = config.getInitParameter("errorJSP"); 80 forceExtension = config.getInitParameter("forceExtension"); 81 indexJSP = config.getInitParameter("indexJSP"); 82 busyJSP = config.getInitParameter("busyJSP"); 83 84 String patternList = config.getInitParameter("passThru"); 85 passThru = UrlUtils.parseUrlPatternList(patternList); 86 } 87 88 public void doFilter(ServletRequest req, ServletResponse res, 89 FilterChain chain) throws IOException , ServletException { 90 MultiPartEnabledRequest request = new MultiPartEnabledRequest((HttpServletRequest ) req); 91 HttpServletResponse response = (HttpServletResponse ) res; 92 93 HttpSession session = request.getSession(true); 94 MDC.put("SessionID", session.getId()); 95 96 String cpath = request.getContextPath(); 97 request.setAttribute(CONTEXT, cpath); 98 99 RequestContext context = RequestContextFactoryFinder.createContext(request, 100 response, true); 101 102 try { 103 Config.set(request, Config.FMT_LOCALE, context.getLocale()); 105 106 if (logger.isInfoEnabled()) { 108 logRequest(request); 109 } 110 111 if (passThru(req)) { 112 chain.doFilter(req, res); 113 114 return; 115 } 116 117 MyHandler handler = new MyHandler(context, chain); 118 long t1 = System.currentTimeMillis(); 119 RequestSynchronizer.instance(request).handleRequest(handler); 120 121 long t2 = System.currentTimeMillis(); 122 123 if (logger.isInfoEnabled()) { 124 logger.info("Request Execution total time: " + (t2 - t1) 125 + " ms"); 126 } 127 } catch (Throwable e) { 128 logger.error(e); 129 130 throw new ServletException ("my servlet exception: " + e, e); 132 } finally { 133 context.invalidate(); 134 } 135 } 136 137 private boolean passThru(ServletRequest req) { 138 if (passThru == null) { 139 return false; 140 } 141 142 HttpServletRequest hsr = (HttpServletRequest ) req; 143 144 return UrlUtils.matchPattern(hsr, passThru); 145 } 146 147 148 void setForceExtension(String forceExtension) { 149 this.forceExtension = forceExtension; 150 } 151 152 private void logRequest(HttpServletRequest request) { 153 logger.info(">>> Request " + request.getScheme() + "://" 154 + request.getServerName() + ":" + request.getServerPort() 155 + request.getContextPath() + request.getServletPath() + "[" 156 + request.getPathInfo() + "]" + "[?" + request.getQueryString() 157 + "]"); 158 } 159 160 public static void setSessionIsNew(HttpSession session, boolean isNew) { 161 session.setAttribute(ISNEW, Boolean.toString(isNew)); 162 } 163 164 public static void setForceIndexJsp(HttpSession session, boolean b) { 165 if (b) { 166 session.setAttribute(FORCE_INDEX_JSP, "true"); 167 } else { 168 session.removeAttribute(FORCE_INDEX_JSP); 169 } 170 } 171 172 public void destroy() { 173 } 174 175 class MyHandler implements RequestSynchronizer.Handler { 176 protected RequestContext context; 177 protected HttpServletRequest request; 178 protected HttpServletResponse response; 179 protected FilterChain filterChain; 180 181 public MyHandler(RequestContext context, FilterChain filterChain) { 182 this.context = context; 183 this.request = context.getRequest(); 184 this.response = context.getResponse(); 185 this.filterChain = filterChain; 186 } 187 188 public String getResultURI() { 189 String uri = (String ) request.getAttribute(NEXTVIEW); 191 192 if (uri != null) { 193 uri = UrlUtils.forceExtension(uri, forceExtension); 194 uri = UrlUtils.redirectURI(request, uri); 195 196 return uri; 197 } 198 199 return request.getRequestURI(); 201 } 202 203 public void normalRequest() throws Exception { 204 HttpSession session = request.getSession(true); 205 206 if (request.getParameter(RESET_RANDOM_SEED) != null) { 207 DomUtils.setRandomSeed(123); 208 } 209 210 if (redirectToIndex()) { 211 return; 212 } 213 214 Controller controller = WcfController.instance(session); 216 controller.request(context); 217 218 if (response.containsHeader("Location")) { 220 return; 221 } 222 223 if (context.isResponseComplete()) { 225 return; 226 } 227 228 String uri = (String ) request.getAttribute(NEXTVIEW); 231 232 if (session.getAttribute(FORCE_INDEX_JSP) != null) { 233 session.removeAttribute(FORCE_INDEX_JSP); 234 uri = indexJSP; 235 } 236 237 if (uri != null) { 238 forward(uri); 239 } else { 240 filterChain.doFilter(request, response); 241 } 242 } 243 244 public void recursiveRequest() throws Exception { 245 filterChain.doFilter(request, response); 246 } 247 248 public void showBusyPage(boolean redirect) throws Exception { 249 260 261 filterChain.doFilter(request, response); 263 } 264 265 public boolean isBusyPage() { 266 if (busyJSP == null) { 267 return false; 268 } 269 270 return request.getRequestURI().endsWith(busyJSP); 271 } 272 273 277 private void forward(String uri) throws IOException { 278 uri = UrlUtils.redirectURI(request, uri); 279 uri = UrlUtils.forceExtension(uri, forceExtension); 280 281 if (logger.isInfoEnabled()) { 282 logger.info("redirecting to " + uri); 283 } 284 285 response.sendRedirect(uri); 286 } 287 288 292 protected boolean redirectToIndex() throws Exception { 293 if (indexJSP != null) { 294 if (Environment.isTest()) { 296 return false; 297 } 298 299 HttpSession session = context.getSession(); 300 boolean isNew = session.isNew(); 301 302 if (!isNew) { 303 isNew = !"false".equals(session.getAttribute(ISNEW)); 304 } 305 306 if (isNew) { 307 session.setAttribute(ISNEW, "false"); 308 forward(indexJSP); 309 310 return true; 311 } 312 } 313 314 return false; 315 } 316 } 317 } 318 | Popular Tags |