View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 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  
25  import javax.servlet.Filter;
26  import javax.servlet.FilterChain;
27  import javax.servlet.FilterConfig;
28  import javax.servlet.ServletContext;
29  import javax.servlet.ServletException;
30  import javax.servlet.ServletRequest;
31  import javax.servlet.ServletRequestWrapper;
32  import javax.servlet.ServletResponse;
33  import javax.servlet.http.HttpServletRequest;
34  import javax.servlet.http.HttpServletRequestWrapper;
35  import javax.servlet.http.HttpServletResponse;
36  
37  import org.eclipse.jetty.util.log.Log;
38  import org.eclipse.jetty.util.log.Logger;
39  
40  /* ------------------------------------------------------------ */
41  /** TestFilter.
42   *
43   * This filter checks for a none local request, and if the init parameter
44   * "remote" is not set to true, then all non local requests are forwarded
45   * to /remote.html
46   *
47   */
48  public class TestFilter implements Filter
49  {
50      private static final Logger LOG = Log.getLogger(TestFilter.class);
51  
52      private boolean _remote;
53      private ServletContext _context;
54      private final Set<String> _allowed = new HashSet<String>();
55  
56      /* ------------------------------------------------------------ */
57      /*
58       * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
59       */
60      @Override
61      public void init(FilterConfig filterConfig) throws ServletException
62      {
63          _context= filterConfig.getServletContext();
64          _remote=Boolean.parseBoolean(filterConfig.getInitParameter("remote"));
65          _allowed.add("/favicon.ico");
66          _allowed.add("/jetty_banner.gif");
67          _allowed.add("/remote.html");
68  
69          LOG.debug("TestFilter#remote="+_remote);
70      }
71  
72      /* ------------------------------------------------------------ */
73      /*
74       * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
75       */
76      @Override
77      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
78              throws IOException, ServletException
79      {
80          String from = request.getRemoteAddr();
81          String to = request.getLocalAddr();
82          String path=((HttpServletRequest)request).getServletPath();
83          
84          if (!_remote && !_allowed.contains(path) && !from.equals(to))
85          {
86              _context.getRequestDispatcher("/remote.html").forward(request,response);
87              return;
88          }
89  
90          Integer old_value=null;
91          ServletRequest r = request;
92          while (r instanceof ServletRequestWrapper)
93              r=((ServletRequestWrapper)r).getRequest();
94  
95          try
96          {
97              old_value=(Integer)request.getAttribute("testFilter");
98  
99              Integer value=(old_value==null)?new Integer(1):new Integer(old_value.intValue()+1);
100 
101             request.setAttribute("testFilter", value);
102 
103             String qString = ((HttpServletRequest)request).getQueryString();
104             if (qString != null && qString.indexOf("wrap")>=0)
105             {
106                 request=new HttpServletRequestWrapper((HttpServletRequest)request);
107             }
108             _context.setAttribute("request"+r.hashCode(),value);
109 
110             chain.doFilter(request, response);
111         }
112         finally
113         {
114             request.setAttribute("testFilter", old_value);
115             _context.setAttribute("request"+r.hashCode(),old_value);
116         }
117     }
118 
119     /* ------------------------------------------------------------ */
120     /*
121      * @see javax.servlet.Filter#destroy()
122      */
123     @Override
124     public void destroy()
125     {
126     }
127 
128 }