2015-01-14 147 views
1

我有簡單的JSF應用程序。並試圖瞭解UrlRewriteFilter。UrlRewriteFilter發送參數到控制器

首先我有網址,如: http://testSite/autocomplete?action=lookup&id=45

我想PARAMS 行動ID但在同一時間,我需要用戶(和谷歌機器人)從來沒有見過這種類型的URL但總是http://testSite/lookup/45

我做了這個URL的重寫,但不能發送params到servet控制器。請幫忙。

這是web.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 
    <!-- URL ReWriter --> 
    <filter> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 


    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
     <servlet-name>AutoCompleteServlet</servlet-name> 
     <servlet-class>com.ajax.AutoCompleteServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>AutoCompleteServlet</servlet-name> 
     <url-pattern>/autocomplete</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

urlrewrite.xml:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" 
     "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd"> 

<urlrewrite use-query-string="true"> 

    <rule> 
     <from>/index.jsp</from> 
     <to type="redirect">%{context-path}/</to> 
    </rule> 

    <rule> 
     <from>^/autocomplete\?action=lookup&amp;id=(.*)</from> 
     <!-- <run class="com.ajax.AutoCompleteServlet" method="doGet" />--> 
     <to type="redirect">%{context-path}/lookup/$1</to> 
    </rule> 
    <rule> 
     <from>^/lookup/(.*)</from> 
     <run class="com.ajax.AutoCompleteServlet" method="doPost"> 
      <init-param> 
       <param-name>action</param-name> 
       <param-value>lookup</param-value> 
      </init-param> 
      <init-param> 
       <param-name>id</param-name> 
       <param-value>$1</param-value> 
      </init-param> 
     </run> 
    </rule> 
</urlrewrite> 

和servlet:

package com.ajax; 

import java.io.IOException; 
import javax.servlet.ServletConfig; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import java.util.HashMap; 
import java.util.Iterator; 

public class AutoCompleteServlet extends HttpServlet { 

    private ServletContext context; 
    private ComposerData compData = new ComposerData(); 
    private HashMap composers = compData.getComposers(); 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     this.context = config.getServletContext(); 
    } 

    @Override 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException { 

     String action = request.getParameter("action"); // Always null ??? 
     String targetId = request.getParameter("id"); // Always null ???? 

    } 
} 

回答

1

這確實是預期的行爲。您正在使用路徑信息中的這些參數而不是查詢字符串重定向到一個網址。

您已經基本上2種選擇:(!沒有重定向)

  1. 添加其執行正向規則,另見documentation 「清潔URL」。

    <rule> 
        <from>^/lookup/(.*)$</from> 
        <to>/autocomplete?action=lookup&amp;id=$1</to> 
    </rule> 
    
  2. 更改servlet以從路徑信息中獲取這些參數。

    String[] params = request.getPathInfo().substring(1).split("/"); 
    String action = params[0]; // "lookup" 
    String id = params[1]; // "45" 
    // ... 
    

無關的具體問題,如果「髒」的網址已經被髮布到事先在網絡和已經被searchbots索引,你真的最好使用<to type="redirect-permanent">HTTP 301 )而不是<to type="redirect">HTTP 302)。這將指示searchbots從索引中移除網址,而不是保留爲替代網址。

+0

非常感謝!它不僅確切地說明我需要什麼,而且還回答了我接下來的兩個問題。 –

+0

不客氣。 – BalusC