我正在尝试实现一个获取原始请求的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,以及其他所有(例如/ ,/ bar / ...,/ myservlet / ...)到“myservlet”。查看之前的帖子(例如,根映射here和here,或url重写here),我以为我弄明白了,但它不起作用。
这是我的 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。
答案 0 :(得分:33)
这对你有用。
来自Java™ Servlet Specification Version 3.1 (JSR 340)
第12章将请求映射到Servlet
12.2映射规范
在Web应用程序部署描述符中,以下语法用于定义映射:
以
/
字符开头并以/*
后缀结尾的字符串用于 路径映射。以
*.
前缀开头的字符串用作扩展名映射。空字符串
("")
是一个特殊的网址格式,它完全映射到 应用程序的上下文根,即http://host:port/<contextroot>/
形式的请求。 在这种情况下,路径信息是/
,servlet路径和上下文路径是 空字符串("")
。仅包含
/
字符的字符串表示“默认”servlet 应用。在这种情况下,servlet路径是请求URI减去上下文路径 并且路径信息为空。- 所有其他字符串仅用于完全匹配。
另外,请阅读本书Head First Servlets & JSP: Passing the Sun Certified Web Component Developer Exam (2nd edition)(引用)中的简短示例阅读这个很好的解释:
三种
<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模式表示逻辑/虚拟结构,即指定的模式(路径)不需要物理存在。
<强>更新强>
如果您愿意,正如您在评论中所说,
我希望host:port命中我的servlet,而不是默认的tomcat servlet
然后在这里看到解决方案:
How do I make my web application be the Tomcat default application
换句话说,你想要的是一条路径没有应用程序上下文,这意味着Tomcat默认应用程序的应用程序上下文。
从以上链接引用:
在标准的Tomcat安装中,您会注意到同样的情况 目录(CATALINA_BASE)/ webapps /,有一个名为 ROOT 的目录 (即使在Windows下,资本也很重要)。 就是这样 当前Tomcat默认应用程序的驻留,即 当用户调用时立即调用
http://myhost.company.com[:port]
即可。诀窍是把你的 应用到位。
答案 1 :(得分:1)
我不确定我是否理解你想要的东西但是拦截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>