1 18 19 package org.apache.roller.ui.rendering.servlets; 20 21 import java.io.IOException ; 22 import java.util.Date ; 23 import java.util.HashMap ; 24 import java.util.Map ; 25 import java.util.regex.Pattern ; 26 import javax.servlet.ServletConfig ; 27 import javax.servlet.ServletException ; 28 import javax.servlet.http.HttpServlet ; 29 import javax.servlet.http.HttpServletRequest ; 30 import javax.servlet.http.HttpServletResponse ; 31 import javax.servlet.jsp.JspFactory ; 32 import javax.servlet.jsp.PageContext ; 33 import org.apache.commons.logging.Log; 34 import org.apache.commons.logging.LogFactory; 35 import org.apache.roller.RollerException; 36 import org.apache.roller.business.referrers.IncomingReferrer; 37 import org.apache.roller.business.referrers.ReferrerQueueManager; 38 import org.apache.roller.config.RollerConfig; 39 import org.apache.roller.config.RollerRuntimeConfig; 40 import org.apache.roller.model.RollerFactory; 41 import org.apache.roller.pojos.Template; 42 import org.apache.roller.pojos.WeblogTemplate; 43 import org.apache.roller.pojos.WebsiteData; 44 import org.apache.roller.ui.core.RollerContext; 45 import org.apache.roller.ui.rendering.util.InvalidRequestException; 46 import org.apache.roller.ui.rendering.util.WeblogPageRequest; 47 import org.apache.roller.util.cache.CachedContent; 48 import org.apache.roller.ui.rendering.Renderer; 49 import org.apache.roller.ui.rendering.RendererManager; 50 import org.apache.roller.ui.rendering.model.ModelLoader; 51 import org.apache.roller.ui.rendering.util.SiteWideCache; 52 import org.apache.roller.ui.rendering.util.WeblogEntryCommentForm; 53 import org.apache.roller.ui.rendering.util.WeblogPageCache; 54 import org.apache.roller.ui.rendering.util.ModDateHeaderUtil; 55 import org.apache.roller.util.SpamChecker; 56 57 58 64 public class PageServlet extends HttpServlet { 65 66 private static Log log = LogFactory.getLog(PageServlet.class); 67 68 private boolean processReferrers = true; 70 private static Pattern robotPattern = null; 71 72 private boolean excludeOwnerPages = false; 74 private WeblogPageCache weblogPageCache = null; 75 private SiteWideCache siteWideCache = null; 76 77 78 81 public void init(ServletConfig servletConfig) throws ServletException { 82 83 super.init(servletConfig); 84 85 log.info("Initializing PageServlet"); 86 87 this.excludeOwnerPages = 88 RollerConfig.getBooleanProperty("cache.excludeOwnerEditPages"); 89 90 this.weblogPageCache = WeblogPageCache.getInstance(); 92 93 this.siteWideCache = SiteWideCache.getInstance(); 95 96 this.processReferrers = 98 RollerConfig.getBooleanProperty("referrers.processing.enabled"); 99 100 log.info("Referrer processing enabled = "+this.processReferrers); 101 102 String robotPatternStr = RollerConfig.getProperty("referrer.robotCheck.userAgentPattern"); 104 if (robotPatternStr != null && robotPatternStr.length() > 0) { 105 try { 107 robotPattern = Pattern.compile(robotPatternStr); 108 } catch (Exception e) { 109 log.error("Error parsing referrer.robotCheck.userAgentPattern value '" + 111 robotPatternStr + "'. Robots will not be filtered. ", e); 112 } 113 } 114 } 115 116 117 120 public void doGet(HttpServletRequest request, HttpServletResponse response) 121 throws ServletException , IOException { 122 123 log.debug("Entering"); 124 125 if(this.processReferrers) { 129 boolean spam = this.processReferrer(request); 130 if(spam) { 131 log.debug("spammer, giving 'em a 403"); 132 if(!response.isCommitted()) response.reset(); 133 response.sendError(HttpServletResponse.SC_FORBIDDEN); 134 return; 135 } 136 } 137 138 139 WebsiteData weblog = null; 140 boolean isSiteWide = false; 141 142 WeblogPageRequest pageRequest = null; 143 try { 144 pageRequest = new WeblogPageRequest(request); 145 146 weblog = pageRequest.getWeblog(); 147 if(weblog == null) { 148 throw new RollerException("unable to lookup weblog: "+ 149 pageRequest.getWeblogHandle()); 150 } 151 152 isSiteWide = RollerRuntimeConfig.isSiteWideWeblog(pageRequest.getWeblogHandle()); 154 155 } catch (Exception e) { 156 log.debug("error creating page request", e); 158 response.sendError(HttpServletResponse.SC_NOT_FOUND); 159 return; 160 } 161 162 163 long lastModified = System.currentTimeMillis(); 165 if(isSiteWide) { 166 lastModified = siteWideCache.getLastModified().getTime(); 167 } else if (weblog.getLastModified() != null) { 168 lastModified = weblog.getLastModified().getTime(); 169 } 170 171 if(!pageRequest.isLoggedIn()) { 175 if (ModDateHeaderUtil.respondIfNotModified(request,response,lastModified)) { 176 return; 177 } else { 178 ModDateHeaderUtil.setLastModifiedHeader(response,lastModified); 180 } 181 } 182 183 184 String cacheKey = null; 186 if(isSiteWide) { 187 cacheKey = siteWideCache.generateKey(pageRequest); 188 } else { 189 cacheKey = weblogPageCache.generateKey(pageRequest); 190 } 191 192 if((!this.excludeOwnerPages || !pageRequest.isLoggedIn()) && 194 request.getAttribute("skipCache") == null) { 195 196 CachedContent cachedContent = null; 197 if(isSiteWide) { 198 cachedContent = (CachedContent) siteWideCache.get(cacheKey); 199 } else { 200 cachedContent = (CachedContent) weblogPageCache.get(cacheKey, lastModified); 201 } 202 203 if(cachedContent != null) { 204 log.debug("HIT "+cacheKey); 205 206 response.setContentLength(cachedContent.getContent().length); 207 response.setContentType(cachedContent.getContentType()); 208 response.getOutputStream().write(cachedContent.getContent()); 209 return; 210 211 } else { 212 log.debug("MISS "+cacheKey); 213 } 214 } 215 216 217 Template page = null; 219 220 if (request.getParameter("popup") != null) { 223 try { 224 page = weblog.getPageByName("_popupcomments"); 226 } catch(Exception e ) { 227 } 229 230 if(page == null) { 232 page = new WeblogTemplate("templates/weblog/popupcomments.vm", weblog, 233 "Comments", "Comments", "dummy_link", 234 "dummy_template", new Date (), "velocity", true, false, null); 235 } 236 237 } else if (pageRequest.getWeblogPageName() != null) { 239 page = pageRequest.getWeblogPage(); 240 241 } else { 243 try { 244 page = weblog.getDefaultPage(); 245 } catch(Exception e) { 246 log.error("Error getting weblogs default page", e); 247 } 248 } 249 250 if (page == null) { 252 if(!response.isCommitted()) response.reset(); 253 response.sendError(HttpServletResponse.SC_NOT_FOUND); 254 return; 255 } 256 257 log.debug("page found, dealing with it"); 258 259 boolean invalid = false; 261 if(pageRequest.getWeblogPageName() != null && page.isHidden()) { 262 invalid = true; 263 } 264 if(pageRequest.getLocale() != null) { 265 266 if(!pageRequest.getWeblog().isEnableMultiLang()) { 268 invalid = true; 269 } 270 271 } 272 if(pageRequest.getWeblogAnchor() != null) { 273 274 if(pageRequest.getWeblogEntry() == null) { 276 invalid = true; 277 } else if (pageRequest.getLocale() != null && 278 !pageRequest.getWeblogEntry().getLocale().startsWith(pageRequest.getLocale())) { 279 invalid = true; 280 } 281 282 } else if(pageRequest.getWeblogCategoryName() != null) { 283 284 if(pageRequest.getWeblogCategory() == null) { 286 invalid = true; 287 } 288 } 289 290 291 if(invalid) { 292 if(!response.isCommitted()) response.reset(); 293 response.sendError(HttpServletResponse.SC_NOT_FOUND); 294 return; 295 } 296 297 298 300 String mimeType = RollerContext.getServletContext().getMimeType(page.getLink()); 302 String contentType = "text/html; charset=utf-8"; 303 if(mimeType != null) { 304 contentType = mimeType+"; charset=utf-8"; 306 } 307 308 HashMap model = new HashMap (); 309 try { 310 PageContext pageContext = JspFactory.getDefaultFactory().getPageContext( 311 this, request, response,"", true, 8192, true); 312 313 request.setAttribute("pageRequest", pageRequest); 315 316 Map initData = new HashMap (); 318 initData.put("request", request); 319 initData.put("requestParameters", request.getParameterMap()); 320 initData.put("weblogRequest", pageRequest); 321 initData.put("pageContext", pageContext); 322 323 WeblogEntryCommentForm commentForm = 325 (WeblogEntryCommentForm) request.getAttribute("commentForm"); 326 if(commentForm != null) { 327 initData.put("commentForm", commentForm); 328 } 329 330 String pageModels = RollerConfig.getProperty("rendering.pageModels"); 332 ModelLoader.loadModels(pageModels, model, initData, true); 333 334 if(RollerRuntimeConfig.isSiteWideWeblog(weblog.getHandle())) { 336 String siteModels = RollerConfig.getProperty("rendering.siteModels"); 337 ModelLoader.loadModels(siteModels, model, initData, true); 338 } 339 340 ModelLoader.loadCustomModels(weblog, model, initData); 342 343 ModelLoader.loadOldModels(model, request, response, pageContext, pageRequest); 345 346 } catch (RollerException ex) { 347 log.error("Error loading model objects for page", ex); 348 349 if(!response.isCommitted()) response.reset(); 350 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 351 return; 352 } 353 354 355 Renderer renderer = null; 357 try { 358 log.debug("Looking up renderer"); 359 renderer = RendererManager.getRenderer(page); 360 } catch(Exception e) { 361 log.error("Couldn't find renderer for page "+page.getId(), e); 363 364 if(!response.isCommitted()) response.reset(); 365 response.sendError(HttpServletResponse.SC_NOT_FOUND); 366 return; 367 } 368 369 CachedContent rendererOutput = new CachedContent(24567, contentType); 371 try { 372 log.debug("Doing rendering"); 373 renderer.render(model, rendererOutput.getCachedWriter()); 374 375 rendererOutput.flush(); 377 rendererOutput.close(); 378 } catch(Exception e) { 379 log.error("Error during rendering for page "+page.getId(), e); 381 382 if(!response.isCommitted()) response.reset(); 383 response.sendError(HttpServletResponse.SC_NOT_FOUND); 384 return; 385 } 386 387 388 390 log.debug("Flushing response output"); 392 response.setContentType(contentType); 393 response.setContentLength(rendererOutput.getContent().length); 394 response.getOutputStream().write(rendererOutput.getContent()); 395 396 if((!this.excludeOwnerPages || !pageRequest.isLoggedIn()) && 398 request.getAttribute("skipCache") == null) { 399 log.debug("PUT "+cacheKey); 400 401 if(isSiteWide) { 403 siteWideCache.put(cacheKey, rendererOutput); 404 } else { 405 weblogPageCache.put(cacheKey, rendererOutput); 406 } 407 } else { 408 log.debug("SKIPPED "+cacheKey); 409 } 410 411 log.debug("Exiting"); 412 } 413 414 415 423 public void doPost(HttpServletRequest request, HttpServletResponse response) 424 throws ServletException , IOException { 425 426 request.setAttribute("skipCache", "true"); 428 429 this.doGet(request, response); 431 } 432 433 434 440 private boolean processReferrer(HttpServletRequest request) { 441 442 log.debug("processing referrer for "+request.getRequestURI()); 443 444 WeblogPageRequest pageRequest; 449 try { 450 pageRequest = new WeblogPageRequest(request); 451 } catch (InvalidRequestException ex) { 452 return false; 453 } 454 455 if(RollerRuntimeConfig.isSiteWideWeblog(pageRequest.getWeblogHandle())) { 457 return false; 458 } 459 460 if (robotPattern != null) { 462 String userAgent = request.getHeader("User-Agent"); 463 if (userAgent != null && userAgent.length() > 0 && 464 robotPattern.matcher(userAgent).matches()) { 465 log.debug("skipping referrer from robot"); 466 return false; 467 } 468 } 469 470 String referrerUrl = request.getHeader("Referer"); 471 StringBuffer reqsb = request.getRequestURL(); 472 if (request.getQueryString() != null) { 473 reqsb.append("?"); 474 reqsb.append(request.getQueryString()); 475 } 476 String requestUrl = reqsb.toString(); 477 478 log.debug("referrer = "+referrerUrl); 479 480 String selfSiteFragment = "/"+pageRequest.getWeblogHandle(); 482 if (referrerUrl != null && referrerUrl.indexOf(selfSiteFragment) != -1) { 483 log.debug("skipping referrer from own blog"); 484 return false; 485 } 486 487 if (pageRequest != null && pageRequest.getWeblogHandle() != null) { 489 490 String basePageUrlWWW = 492 RollerRuntimeConfig.getAbsoluteContextURL() + "/" + pageRequest.getWeblogHandle(); 493 String basePageUrl = basePageUrlWWW; 494 if ( basePageUrlWWW.startsWith("http://www.") ) { 495 basePageUrl = "http://"+basePageUrlWWW.substring(11); 497 } 498 499 if (referrerUrl == null || 501 (!referrerUrl.startsWith(basePageUrl) && 502 !referrerUrl.startsWith(basePageUrlWWW))) { 503 504 if ( referrerUrl != null ) { 506 int lastSlash = requestUrl.indexOf("/", 8); 508 if (lastSlash == -1) lastSlash = requestUrl.length(); 509 String requestSite = requestUrl.substring(0, lastSlash); 510 511 if (referrerUrl.matches(requestSite + ".*\\.do.*")) { 512 referrerUrl = null; 513 } else if(SpamChecker.checkReferrer(pageRequest.getWeblog(), referrerUrl)) { 514 return true; 515 } 516 } 517 518 } else { 519 log.debug("Ignoring referer = "+referrerUrl); 520 return false; 521 } 522 } 523 524 try { 526 IncomingReferrer referrer = new IncomingReferrer(); 527 referrer.setReferrerUrl(referrerUrl); 528 referrer.setRequestUrl(requestUrl); 529 referrer.setWeblogHandle(pageRequest.getWeblogHandle()); 530 referrer.setWeblogAnchor(pageRequest.getWeblogAnchor()); 531 referrer.setWeblogDateString(pageRequest.getWeblogDate()); 532 533 ReferrerQueueManager refQueue = 534 RollerFactory.getRoller().getReferrerQueueManager(); 535 refQueue.processReferrer(referrer); 536 } catch(Exception e) { 537 log.error("Error processing referrer", e); 538 } 539 540 return false; 541 } 542 543 } 544 | Popular Tags |