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

时间:2013-01-08 20:06:29

标签: java tomcat servlets url-pattern

我正在尝试实现一个获取原始请求的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”。查看之前的帖子(例如,根映射herehere,或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。

2 个答案:

答案 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>