簡體   English   中英

如何在Tomcat的<servlet-mapping> <url-pattern>中指定查詢字符串?

[英]How do I specify a query string in Tomcat's <servlet-mapping> <url-pattern>?

我正在運行Tomcat 5.5.4並且運行沒有問題的servlet。 但是,我想設置一個映射,以便在提交包含特定查詢字符串的URL時僅啟動servlet。

現在在web.xml中我有: <servlet-mapping> <servlet-name>MyServer</servlet-name> <url-pattern>/go/*</url-pattern> </servlet-mapping>

如果瀏覽器提交http:// localhost / MyServer / go?P = 123 ,則啟動servlet並且一切正常。 但是,如果URL完全如圖所示,我只想啟動該servlet。 不幸的是,現在如果URL是http:// localhost / MyServer / go?P = AnyDarnThing ,servlet仍然會啟動。 我已嘗試設置以下內容: <url-pattern>/go?P=123</url-pattern>但這會導致請求的資源(/ MyServer / go)不可用。

我在上面的URL模式上嘗試了很多變化(引用字符串,...),但我總是得到上面的錯誤。 我注意到,如果我(為了調試目的)放棄“?” 如在<url-pattern>/goP=123</url-pattern>我不再收到錯誤消息並且服務器啟動(但是,當然,它不響應“查詢字符串”,因為它沒有正確形成。)這告訴我“?” 導致映射問題。 我已經嘗試用它的URL特殊字符替換它,如下所示: <url-pattern>/go%3FP=123</url-pattern>但是當我嘗試刪除“?”時,這給出了上面描述的相同結果。 共。

我意識到,當提交任何查詢字符串時,我可以讓servlet啟動,然后“忽略”除了我關心的所有請求之外的所有請求,但有一個原因我寧願不啟動servlet。 所以,我的問題是,如何配置servlet以便僅在包含特定查詢字符串時啟動它?

謝謝。

你不能這樣做。 url-pattern非常有限。

如果您希望根據GET參數執行不同的操作,則可以手動執行此操作。 在servlet的doGet()方法中有一個簡單的if -clause,並根據查詢字符串/ get param調用不同的方法。

你不能使用URL模式來做到這一點。

您可以使用過濾器來實現此目的。 實現一個過濾器,只有在查詢參數存在時才會轉發到Servlet。

以下是過濾器的外觀:

public class ServletAcessFilter implements Filter
{
  public void init(FilterConfig filterConfig) throws ServletException
  {

  }

  public void doFilter(ServletRequest request, ServletResponse response,
  FilterChain filterChain) throws IOException, ServletException
  {
    //validate the request, check if the request can be forwarded to servlet.
    if(request.getParameter("P").equalsIgnoreCase("123")){
        filterChain.doFilter(request, response);
    } else {
        //write what you want to do if the request has no access
        //below code will write 404 not found, you can do based on your requirement
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setStatus(404);
    }
  }

  public void destroy()
  {

  }
}

web.xml定義過濾器,如下所示:

<filter>
    <filter-name>ServletAccessFilter</filter-name>
    <filter-class>com.ServletAcessFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ServletAccessFilter</filter-name>
    <url-pattern>/go/*</url-pattern>
</filter-mapping>

要添加到Bozho響應,您還可以嘗試轉到Clean URL

這將極大地增加您在URL模式匹配方面的選擇,特別是,如果您需要,可以顯着簡化前端反向代理的配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM