1 23 24 package org.infoglue.deliver.applications.filters; 25 26 import java.io.IOException ; 27 import java.net.URLDecoder ; 28 import java.util.ArrayList ; 29 import java.util.List ; 30 import java.util.StringTokenizer ; 31 32 import javax.servlet.Filter ; 33 import javax.servlet.FilterChain ; 34 import javax.servlet.FilterConfig ; 35 import javax.servlet.ServletException ; 36 import javax.servlet.ServletRequest ; 37 import javax.servlet.ServletResponse ; 38 import javax.servlet.http.HttpServletRequest ; 39 import javax.servlet.http.HttpServletResponse ; 40 41 import org.apache.log4j.Logger; 42 import org.infoglue.cms.controllers.kernel.impl.simple.RedirectController; 43 import org.infoglue.cms.exception.SystemException; 44 45 50 51 public class RedirectFilter implements Filter 52 { 53 public final static Logger logger = Logger.getLogger(RedirectFilter.class.getName()); 54 55 private static String FILTER_URIS_PARAMETER = "FilterURIs"; 56 57 private FilterConfig filterConfig = null; 58 private URIMatcher uriMatcher = null; 59 60 61 public void init(FilterConfig filterConfig) throws ServletException 62 { 63 this.filterConfig = filterConfig; 64 String filterURIs = filterConfig.getInitParameter(FILTER_URIS_PARAMETER); 65 uriMatcher = URIMatcher.compilePatterns(splitString(filterURIs, ","), false); 66 } 67 68 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException , ServletException 69 { 70 long end, start = System.currentTimeMillis(); 71 HttpServletRequest httpRequest = (HttpServletRequest ) servletRequest; 72 HttpServletResponse httpResponse = (HttpServletResponse ) servletResponse; 73 String requestURL = httpRequest.getRequestURL().toString(); 75 76 logger.info("Redirect filter requestURL:" + requestURL); 77 78 79 try 80 { 81 String requestURI = URLDecoder.decode(getContextRelativeURI(httpRequest), "UTF-8"); 82 83 if (!uriMatcher.matches(requestURI)) 84 { 85 try 86 { 87 String redirectUrl = RedirectController.getController().getRedirectUrl(httpRequest); 88 if(redirectUrl != null && redirectUrl.length() > 0) 89 { 90 httpResponse.sendRedirect(redirectUrl); 91 return; 92 } 93 } 94 catch (SystemException se) 95 { 96 logger.warn("Error in redirect filter: " + se.getMessage(), se); 97 httpRequest.setAttribute("responseCode", "500"); 98 httpRequest.setAttribute("error", se); 99 httpRequest.getRequestDispatcher("/ErrorPage.action").forward(httpRequest, httpResponse); 100 } 101 catch (Exception e) 102 { 103 logger.warn("Error in redirect filter: " + e.getMessage(), e); 104 httpRequest.setAttribute("responseCode", "404"); 105 httpRequest.setAttribute("error", e); 106 httpRequest.getRequestDispatcher("/ErrorPage.action").forward(httpRequest, httpResponse); 107 } 108 } 109 } 110 catch (Exception e) 111 { 112 logger.error("RedirectFilter threw error:" + e.getMessage(), e); 113 } 114 115 filterChain.doFilter(httpRequest, httpResponse); 116 117 } 118 119 public void destroy() 120 { 121 this.filterConfig = null; 122 } 123 124 125 private String getContextRelativeURI(HttpServletRequest request) { 127 String requestURI = request.getRequestURI(); 128 String contextPath = request.getContextPath(); 129 if (contextPath != null && requestURI.length() > 0) { 130 requestURI = requestURI.substring(contextPath.length(), requestURI.length()); 131 } 132 if (requestURI.length() == 0) 133 return "/"; 134 return requestURI; 135 } 136 137 private String [] splitString(String str, String delimiter) { 138 List list = new ArrayList (); 139 StringTokenizer st = new StringTokenizer (str, delimiter); 140 while (st.hasMoreTokens()) { 141 String t = st.nextToken(); 143 if (t.startsWith("_")) { 144 break; 145 } else { 146 list.add(t.trim()); 148 } 149 } 150 return (String []) list.toArray(new String [list.size()]); 151 } 152 153 154 } | Popular Tags |