一尘不染

将特定的servlet映射为Tomcat中的默认servlet

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(), ...
}

由于我要处理的服务可能会将请求发送到根,因此我想将我的servlet映射为默认servlet,从而接收任何没有显式servlet映射的请求。假设我的servlet的名称是“myservlet”,并且与另一个servlet“
foo”一起运行,我希望所有以http://mycompany.com/foo/
形式出现的请求都可以传递给foo,否则(例如,/,/ bar /…、/myservlet/…)更改为“myservlet”。

这是我的 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部署在其自己的容器中)。万一重要,我在Ubuntu12.10上使用Tomcat 7.0.30。


阅读 631

收藏
2020-06-16

共1个答案

一尘不染

这对您应该有用。

摘自 Java™Servlet规范版本3.1(JSR
340)

第12章将请求映射到Servlet

12.2映射规范

在Web应用程序部署描述符中,以下语法用于定义映射:

  • 以字符开头/并以/*后缀结尾的字符串用于 路径映射

  • *.前缀开头的字符串用作 扩展名映射

  • 空字符串("")是一种 特殊的URL模式,它精确地映射到应用程序的上下文根
    ,即形式的请求http://host:port/<contextroot>/。在这种情况下,路径信息为/,而servlet路径和上下文路径为空字符串("")

  • 仅包含/字符的字符串表示应用程序的 “默认” servlet
    。在这种情况下,Servlet路径是请求URI减去上下文路径,并且路径信息为null。

  • 所有其他字符串仅用于 完全匹配

另外,请阅读《Head FirstServlets&JSP:通过Sun认证的Web组件开发人员考试(第二版)(引用)一书中的简短示例,以很好地解释这个解释:

三种类型的<url-pattern>元素

1)完全匹配

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

  • 必须以斜杠(/)开头。
  • 可以有扩展名(如.do),但这不是必需的。

2)目录匹配

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

  • 必须以斜杠(/)开头。
  • 始终以斜杠/星号(/*)结尾。

3)延长比赛

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

  • 必须以星号(*)开头(切勿以斜杠开头)。
  • 星号后必须带有点扩展名(.do,.jsp等)。

重要说明:
URL模式代表 逻辑/虚拟结构 ,即 ,指定的模式(路径)不需要物理存在


更新

如您在评论中所述,如果您愿意,

我希望host:port命中我的servlet,而不是默认的tomcat servlet

然后在此处查看解决方案:
如何使我的Web应用程序成为Tomcat默认应用程序

换句话说,您想要的是 没有应用程序上下文 的路径,这意味着Tomcat默认应用程序的应用程序上下文。

从以上链接引用:

在标准的Tomcat安装中,您会注意到在同一目录(CATALINA_BASE)/ webapps /下,有一个名为 ROOT 的目录(即使在Windows下,大写字母也很重要)。这就是当前Tomcat默认应用程序的驻留位置,当用户调用时,该默认应用程序即刻被调用http://myhost.company.com[:port]。诀窍是将您的应用程序放在其位置。

2020-06-16