将特定servlet映射为Tomcat中的缺省servlet

我正在尝试实现一个获取原始请求的servlet,并决定处理它们,还是将它们转发到另一个后端服务器。 它类似于负载均衡器,其中收到的请求被转发到(在我的情况下为2)目的地之一。 其中一个目标是远程(在另一台主机上)。 此外,请求可以到根( http://mycompany.com/ )。

因为我想获得原始请求,所以我实现了自己的servlet(子类化HttpServlet ),这非常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/ …forms发出的请求都被传递给foo,以及一切else(例如/,/ bar / …,/ myservlet / …)到“myservlet”。 看一下之前的post(例如, 这里和这里的根映射,或者这里的 url重写),我以为我想出来了,但它不起作用。

这是我的web.xml

   ProxyServlet com.mycompany.MyProxyServlet 1   ProxyServlet /*   

在上面的web.xml中 ,对于url-pattern我试过了

 "/" and "/*" and empty (ie, ), 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//forms的请求。 在这种情况下,路径信息是/ ,并且servlet路径和上下文路径是空字符串("")

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

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

另外,请阅读Head First Servlets&JSP:Passing the Sun认证Web组件开发人员考试(第2版) (引用)一书中的简短示例阅读这篇精彩的解释:

三种类型的元素

1)完全匹配

例:
/Beer/SelectBeer.do

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

2)DIRECTORY匹配

例:
/Beer/*

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

3)扩展匹配

例:
*.do

  • 必须以星号( * )开头(绝对不带斜线)。
  • 在星号之后,它必须有一个点扩展名(.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的一种方式

  Default   

那样:任何东西都被重定向到这个servlet,包括图像等,例如,我打开另一个页面,这个显示这个,root,然后我可以在log 4中看到更多请求到同一页面,3个用于css,一个用于图像。

  Default /