View Javadoc

    1   //========================================================================
    2   //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd.
    3   //------------------------------------------------------------------------
    4   //Licensed under the Apache License, Version 2.0 (the "License");
    5   //you may not use this file except in compliance with the License.
    6   //You may obtain a copy of the License at
    7   //http://www.apache.org/licenses/LICENSE-2.0
    8   //Unless required by applicable law or agreed to in writing, software
    9   //distributed under the License is distributed on an "AS IS" BASIS,
    10  //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  //See the License for the specific language governing permissions and
    12  //limitations under the License.
    13  //========================================================================
    14
    15  package org.mortbay.jetty.handler;
    16
    17  import java.io.IOException;
    18  import java.util.Map;
    19
    20  import javax.servlet.ServletException;
    21  import javax.servlet.http.HttpServletRequest;
    22  import javax.servlet.http.HttpServletResponse;
    23
    24  import org.mortbay.jetty.Request;
    25  import org.mortbay.jetty.servlet.PathMap;
    26  import org.mortbay.util.URIUtil;
    27
    28  /* ------------------------------------------------------------ */
    29  /** Path Rewrite Handler
    30   *<p>This path uses the pattern matching of {@link PathMap} to rewrite URI's
    31   * of received requests. A typical jetty.xml configuration would be: <pre>
    32   *     &lt;Set name="handler"&gt;
    33   *       &lt;New id="Handlers" class="org.mortbay.jetty.handler.RewriteHandler"&gt;
    34   *         &lt;Set name="rewriteRequestURI"&gt;false&lt;/Set&gt;
    35   *         &lt;Set name="rewritePathInfo"&gt;false&lt;/Set&gt;
    36   *         &lt;Set name="originalPathAttribute"&gt;requestedPath&lt;/Set&gt;
    37   *         &lt;Call name="addRewriteRule"&gt;&lt;Arg&gt;/other/*&lt;/Arg&gt;&lt;Arg&gt;/test&lt;/Arg&gt;&lt;/Call&gt;
    38   *         &lt;Call name="addRewriteRule"&gt;&lt;Arg&gt;/test/*&lt;/Arg&gt;&lt;Arg&gt;&lt;/Arg&gt;&lt;/Call&gt;
    39   *         &lt;Call name="addRewriteRule"&gt;&lt;Arg&gt;/*&lt;/Arg&gt;&lt;Arg&gt;/test&lt;/Arg&gt;&lt;/Call&gt;
    40   *         &lt;Set name="handler"&gt;
    41   *           &lt;New id="Handlers" class="org.mortbay.jetty.handler.HandlerCollection"&gt;
    42   *             &lt;Set name="handlers"&gt;
    43   *              &lt;Array type="org.mortbay.jetty.Handler"&gt;
    44   *                &lt;Item&gt;
    45   *                  &lt;New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"/&gt;
    46   *                &lt;/Item&gt;
    47   *                &lt;Item&gt;
    48   *                  &lt;New id="DefaultHandler" class="org.mortbay.jetty.handler.DefaultHandler"/&gt;
    49   *                &lt;/Item&gt;
    50   *                &lt;Item&gt;
    51   *                  &lt;New id="RequestLog" class="org.mortbay.jetty.handler.RequestLogHandler"/&gt;
    52   *                &lt;/Item&gt;
    53   *              &lt;/Array&gt;
    54   *             &lt;/Set&gt;
    55   *           &lt;/New&gt;
    56   *         &lt;/Set&gt;
    57   *       &lt;/New&gt;
    58   *     &lt;/Set&gt;
    59   * </pre>
    60   *
    61   */
    62  public class RewriteHandler extends HandlerWrapper
    63  {
    64      private boolean _rewriteRequestURI=true;
    65      private boolean _rewritePathInfo=true;
    66      private String _originalPathAttribute;
    67      private PathMap _rewrite = new PathMap(true);
    68
    69      /* ------------------------------------------------------------ */
    70      /**
    71       * @return the rewriteRequestURI If true, this handler will rewrite the value
    72       * returned by {@link HttpServletRequest#getRequestURI()}.
    73       *
    74       */
    75      public boolean isRewriteRequestURI()
    76      {
    77          return _rewriteRequestURI;
    78      }
    79
    80      /* ------------------------------------------------------------ */
    81      /**
    82       * @param rewriteRequestURI true if this handler will rewrite the value
    83       * returned by {@link HttpServletRequest#getRequestURI()}.
    84       */
    85      public void setRewriteRequestURI(boolean rewriteRequestURI)
    86      {
    87          _rewriteRequestURI=rewriteRequestURI;
    88      }
    89
    90      /* ------------------------------------------------------------ */
    91      /**
    92       * @return true if this handler will rewrite the value
    93       * returned by {@link HttpServletRequest#getPathInfo()}.
    94       */
    95      public boolean isRewritePathInfo()
    96      {
    97          return _rewritePathInfo;
    98      }
    99
    100     /* ------------------------------------------------------------ */
    101     /**
    102      * @param rewritePathInfo true if this handler will rewrite the value
    103      * returned by {@link HttpServletRequest#getPathInfo()}.
    104      */
    105     public void setRewritePathInfo(boolean rewritePathInfo)
    106     {
    107         _rewritePathInfo=rewritePathInfo;
    108     }
    109
    110     /* ------------------------------------------------------------ */
    111     /**
    112      * @return the originalPathAttribte. If non null, this string will be used
    113      * as the attribute name to store the original request path.
    114      */
    115     public String getOriginalPathAttribute()
    116     {
    117         return _originalPathAttribute;
    118     }
    119
    120     /* ------------------------------------------------------------ */
    121     /**
    122      * @param originalPathAttribte If non null, this string will be used
    123      * as the attribute name to store the original request path.
    124      */
    125     public void setOriginalPathAttribute(String originalPathAttribte)
    126     {
    127         _originalPathAttribute=originalPathAttribte;
    128     }
    129
    130     /* ------------------------------------------------------------ */
    131     /**
    132      * @return A {@link PathMap} of the rewriting rules.
    133      */
    134     public PathMap getRewrite()
    135     {
    136         return _rewrite;
    137     }
    138
    139     /* ------------------------------------------------------------ */
    140     /**
    141      * @param rewrite A {@link PathMap} of the rewriting rules. Only
    142      * prefix paths should be included.
    143      */
    144     public void setRewrite(PathMap rewrite)
    145     {
    146         _rewrite=rewrite;
    147     }
    148
    149
    150     /* ------------------------------------------------------------ */
    151     /** Add a path rewriting rule
    152      * @param pattern The path pattern to match. The pattern must start with / and may use
    153      * a trailing /* as a wildcard.
    154      * @param prefix The path prefix which will replace the matching part of the path.
    155      */
    156     public void addRewriteRule(String pattern, String prefix)
    157     {
    158         if (pattern==null || pattern.length()==0 || !pattern.startsWith("/"))
    159             throw new IllegalArgumentException();
    160         if (_rewrite==null)
    161             _rewrite=new PathMap(true);
    162         _rewrite.put(pattern,prefix);
    163     }
    164
    165     /* ------------------------------------------------------------ */
    166     /* (non-Javadoc)
    167      * @see org.mortbay.jetty.handler.HandlerWrapper#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int)
    168      */
    169     public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException
    170     {
    171         if (isStarted() && _rewrite!=null)
    172         {
    173             Map.Entry rewrite =_rewrite.getMatch(target);
    174
    175             if (rewrite!=null && rewrite.getValue()!=null)
    176             {
    177                 if (_originalPathAttribute!=null)
    178                     request.setAttribute(_originalPathAttribute,target);
    179
    180                 target=URIUtil.addPaths(rewrite.getValue().toString(),
    181                         PathMap.pathInfo(rewrite.getKey().toString(),target));
    182
    183                 if (_rewriteRequestURI)
    184                     ((Request)request).setRequestURI(target);
    185
    186                 if (_rewritePathInfo)
    187                     ((Request)request).setPathInfo(target);
    188             }
    189         }
    190         super.handle(target,request,response,dispatch);
    191
    192     }
    193 }