我正在尝试实现一个获取原始请求的servlet,并决定处理它们,或将它们转发到另一个后端服务器。它类似于负载均衡器,其中接收到的请求被转发到(在我的情况下为2)目的地之一。目的地之一是远程的(在另一台主机上)。此外,这些请求可能来自根(http://mycompany.com/)。
由于我想获取原始请求,因此实现了自己的servlet(子类HttpServlet),并且效果很好。我的servlet看起来像:
HttpServlet
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。
这对您应该有用。
摘自 Java™Servlet规范版本3.1(JSR 340)
第12章将请求映射到Servlet 12.2映射规范 在Web应用程序部署描述符中,以下语法用于定义映射: 以字符开头/并以/*后缀结尾的字符串用于 路径映射 。 以*.前缀开头的字符串用作 扩展名映射 。 空字符串("")是一种 特殊的URL模式,它精确地映射到应用程序的上下文根 ,即形式的请求http://host:port/<contextroot>/。在这种情况下,路径信息为/,而servlet路径和上下文路径为空字符串("")。 仅包含/字符的字符串表示应用程序的 “默认” servlet 。在这种情况下,Servlet路径是请求URI减去上下文路径,并且路径信息为null。 所有其他字符串仅用于 完全匹配 。
在Web应用程序部署描述符中,以下语法用于定义映射:
以字符开头/并以/*后缀结尾的字符串用于 路径映射 。
/
/*
以*.前缀开头的字符串用作 扩展名映射 。
*.
空字符串("")是一种 特殊的URL模式,它精确地映射到应用程序的上下文根 ,即形式的请求http://host:port/<contextroot>/。在这种情况下,路径信息为/,而servlet路径和上下文路径为空字符串("")。
("")
http://host:port/<contextroot>/
仅包含/字符的字符串表示应用程序的 “默认” 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-pattern>元素
<url-pattern>
例: <url-pattern>/Beer/SelectBeer.do</url-pattern>
<url-pattern>/Beer/SelectBeer.do</url-pattern>
例: <url-pattern>/Beer/*</url-pattern>
<url-pattern>/Beer/*</url-pattern>
例: <url-pattern>*.do</url-pattern>
<url-pattern>*.do</url-pattern>
*
重要说明: URL模式代表 逻辑/虚拟结构 ,即 ,指定的模式(路径)不需要物理存在 。
更新
如您在评论中所述,如果您愿意,
我希望host:port命中我的servlet,而不是默认的tomcat servlet
然后在此处查看解决方案: 如何使我的Web应用程序成为Tomcat默认应用程序
换句话说,您想要的是 没有应用程序上下文 的路径,这意味着Tomcat默认应用程序的应用程序上下文。
从以上链接引用:
在标准的Tomcat安装中,您会注意到在同一目录(CATALINA_BASE)/ webapps /下,有一个名为 ROOT 的目录(即使在Windows下,大写字母也很重要)。这就是当前Tomcat默认应用程序的驻留位置,当用户调用时,该默认应用程序即刻被调用http://myhost.company.com[:port]。诀窍是将您的应用程序放在其位置。
http://myhost.company.com[:port]