View Javadoc

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