[英]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.