View Javadoc

1   // ========================================================================
2   // Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
12  // ========================================================================
13  
14  package com.acme;
15  
16  import java.io.IOException;
17  import java.util.HashSet;
18  import java.util.Set;
19  
20  import javax.servlet.Filter;
21  import javax.servlet.FilterChain;
22  import javax.servlet.FilterConfig;
23  import javax.servlet.ServletContext;
24  import javax.servlet.ServletException;
25  import javax.servlet.ServletRequest;
26  import javax.servlet.ServletRequestWrapper;
27  import javax.servlet.ServletResponse;
28  import javax.servlet.http.HttpServletRequest;
29  import javax.servlet.http.HttpServletRequestWrapper;
30  import javax.servlet.http.HttpServletResponse;
31  
32  import org.eclipse.jetty.util.log.Log;
33  import org.eclipse.jetty.util.log.Logger;
34  
35  /* ------------------------------------------------------------ */
36  /** TestFilter.
37   * 
38   * This filter checks for a none local request, and if the init parameter
39   * "remote" is not set to true, then all non local requests are forwarded
40   * to /remote.html
41   * 
42   */
43  public class TestFilter implements Filter
44  {
45      private static final Logger LOG = Log.getLogger(TestFilter.class);
46  
47      private boolean _remote;
48      private ServletContext _context;
49      private final Set<String> _allowed = new HashSet<String>();
50      
51      /* ------------------------------------------------------------ */
52      /* 
53       * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
54       */
55      public void init(FilterConfig filterConfig) throws ServletException
56      {
57          _context= filterConfig.getServletContext();
58          _remote=Boolean.parseBoolean(filterConfig.getInitParameter("remote"));
59          _allowed.add("/favicon.ico");
60          _allowed.add("/jetty_banner.gif");
61          
62          LOG.debug("TestFilter#remote="+_remote);
63      }
64  
65      /* ------------------------------------------------------------ */
66      /* 
67       * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
68       */
69      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
70              throws IOException, ServletException
71      {
72          String from = request.getRemoteHost();
73          String to = request.getServerName();
74          String path=((HttpServletRequest)request).getServletPath();
75  
76          if (!"/remote.html".equals(path) && !_remote && !_allowed.contains(path) && (
77              !from.equals("localhost") && !from.startsWith("127.") && from.indexOf(":1")<0 ||
78              !to.equals("localhost")&&!to.startsWith("127.0.0.") && to.indexOf(":1")<0))
79          {
80              if ("/".equals(path))
81                  _context.getRequestDispatcher("/remote.html").forward(request,response);
82              else
83                  ((HttpServletResponse)response).sendRedirect("/remote.html");
84              return;
85          }
86          
87          Integer old_value=null;
88          ServletRequest r = request;
89          while (r instanceof ServletRequestWrapper)
90              r=((ServletRequestWrapper)r).getRequest();
91          
92          try
93          {
94              old_value=(Integer)request.getAttribute("testFilter");
95              
96              Integer value=(old_value==null)?new Integer(1):new Integer(old_value.intValue()+1);
97                          
98              request.setAttribute("testFilter", value);
99              
100             String qString = ((HttpServletRequest)request).getQueryString();
101             if (qString != null && qString.indexOf("wrap")>=0)
102             {
103                 request=new HttpServletRequestWrapper((HttpServletRequest)request);
104             }
105             _context.setAttribute("request"+r.hashCode(),value);
106             
107             chain.doFilter(request, response);
108         }
109         finally
110         {
111             request.setAttribute("testFilter", old_value);
112             _context.setAttribute("request"+r.hashCode(),old_value);
113         }
114     }
115 
116     /* ------------------------------------------------------------ */
117     /* 
118      * @see javax.servlet.Filter#destroy()
119      */
120     public void destroy()
121     {
122     }
123 
124 }