簡體   English   中英

將特定servlet映射為Tomcat中的缺省servlet

[英]Mapping a specific servlet to be the default servlet in Tomcat

我正在嘗試實現一個獲取原始請求的servlet,並決定處理它們,還是將它們轉發到另一個后端服務器。 它類似於負載均衡器,其中收到的請求被轉發到(在我的情況下為2)目的地之一。 其中一個目標是遠程(在另一台主機上)。 此外,請求可以到根( http://mycompany.com/ )。

因為我想獲得原始請求,所以我實現了自己的servlet(子類化HttpServlet ),這很有用。 我的servlet看起來像:

public class MyProxyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        processOrForward(req, resp);
    }
    // also doGet(), doHead(), ...
}

由於我想要處理的服務可以向root發送請求,我想將我的servlet映射為默認的servlet,從而接收任何沒有顯式servlet映射的請求。 假設我的servlet名稱是“myservlet”,並且正在另一個servlet“foo”的一側運行,我希望所有以http://mycompany.com/foo/ ...形式發出的請求都被傳遞給foo,以及一切else(例如/,/ bar / ...,/ myservlet / ...)到“myservlet”。 看一下之前的帖子(例如, 這里這里的根映射,或者這里的 url重寫),我以為我想出來了,但它不起作用。

這是我的web.xml

<web-app>
  <servlet>
    <servlet-name>ProxyServlet</servlet-name>
    <servlet-class>com.mycompany.MyProxyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>ProxyServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

在上面的web.xml中 ,對於url-pattern我試過了

"/" and "/*" and empty (i.e., <url-pattern></url-pattern>), all behave the same -->
    Requests to root (/)goes to tomcat's default servlet
    Requests to /myservlet/... are handled by "myservlet"
    Requests to /fubar/... are always 404

有沒有辦法將我的servlet變為默認值。 即,任何未專門映射到servlet的請求都會出現(我甚至可以接收所有請求,因為我可以在自己的容器中部署這個servlet)。 如果重要,我在Ubuntu 12.10上使用Tomcat 7.0.30。

這應該對你有用。

來自Java™Servlet規范3.1版(JSR 340)

第12章將請求映射到Servlet

12.2映射規范

在Web應用程序部署描述符中,以下語法用於定義映射:

  • /字符開頭並以/*后綴結尾的字符串用於路徑映射

  • *.開頭的字符串*. prefix用作擴展映射

  • 空字符串("")是一個特殊的URL模式,它完全映射到應用程序的上下文根 ,即http://host:port/<contextroot>/形式的請求。 在這種情況下,路徑信息是/ ,並且servlet路徑和上下文路徑是空字符串("")

  • 僅包含/字符的字符串表示應用程序的“默認”servlet 在這種情況下,servlet路徑是請求URI減去上下文路徑,路徑信息為null。

  • 所有其他字符串僅用於完全匹配


另外,請閱讀Head First Servlets&JSP:Passing the Sun認證Web組件開發人員考試(第2版) (引用)一書中的簡短示例:

三種類型的<url-pattern>元素

1)完全匹配

例:
<url-pattern>/Beer/SelectBeer.do</url-pattern>

  • 必須以斜杠( / )開頭。
  • 可以有擴展名(如.do),但不是必需的。

2)DIRECTORY匹配

例:
<url-pattern>/Beer/*</url-pattern>

  • 必須以斜杠( / )開頭。
  • 始終以斜杠/星號( /* )結尾。

3)EXTENSION匹配

例:
<url-pattern>*.do</url-pattern>

  • 必須以星號( * )開頭(絕對不帶斜線)。
  • 在星號之后,它必須有一個點擴展名(.do,.jsp等)。


重要的提示:
URL模式表示邏輯/虛擬結構 ,即指定的模式(路徑)不需要物理存在


UPDATE

如果您願意,正如您在評論中所說,

我想要host:port來命中我的servlet,而不是默認的tomcat servlet

然后在這里看到解決方案:
如何使我的Web應用程序成為Tomcat默認應用程序

換句話說,您想要的是沒有應用程序上下文的路徑,這意味着Tomcat默認應用程序的應用程序上下文。

從以上鏈接引用:

在標准的Tomcat安裝中,您會注意到在同一目錄(CATALINA_BASE)/ webapps /下,有一個名為ROOT的目錄(即使在Windows下,大寫也很重要)。 這是當前Tomcat默認應用程序的駐留,當用戶調用http://myhost.company.com[:port]時立即調用該應用程序 訣竅是將您的應用程序放在適當的位置。

我不確定我是否理解你想要的東西但是攔截404就是你想做的事情,然后重定向到你想要的地方。

我來到論壇是因為我對tomcat 7有一個奇怪的問題,我正在做你想要的;)

這只是我擁有root,EMPTY的一種方式

<servlet-mapping>
    <servlet-name>Default</servlet-name>
    <url-pattern></url-pattern>
</servlet-mapping>

那樣:任何東西都被重定向到這個servlet,包括圖像等,例如,我打開另一個頁面,這個顯示這個,root,然后我可以在log 4中看到更多請求到同一頁面,3個用於css,一個用於圖像。

<servlet-mapping>
    <servlet-name>Default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

暫無
暫無

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

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