如何配置web.xml(Tomcat 5)使一个servlet处理所有传入请求?

5
基本上,我希望一个servlet来处理所有进来的请求,而不管路径是什么。我在共享托管环境中,并且可以访问配置自己的web.xml文件。
我已经在web.xml中进行了以下配置,但在Tomcat 5上无法正常工作:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=
        "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
    <display-name>Redirect</display-name>
    <servlet>
         <display-name>Redirect</display-name>
         <servlet-name>Redirect</servlet-name>
         <servlet-class>com.Redirect</servlet-class>
         <init-param>
            <param-name>host</param-name>
            <param-value>www.myredirectdomain.com</param-value>
        </init-param>
        <init-param>
            <param-name>redirect-type</param-name>
            <param-value>301</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Redirect</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

以上方法适用于路径中以目录开始的任何内容,例如:
www.mydomain.com/anypath1/anypath2...
www.mydomain.com/anypath1

然而,这并不适用于以下情况:

www.mydomain.com/ or
www.mydomain.com

我也尝试了以下Servlet映射:
<servlet-mapping>
    <servlet-name>Redirect</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

与之前的结果相同,两者都没有起作用... 有人有什么建议吗?
4个回答

4
Tomcat 5实现了Servlet 2.4规范。可以在此处下载: JCP Servlet 2.4 Spec 在第86页的SRV.11.2中,它描述了如何指定Servlet映射。如果我正确理解你想做的事情,你正在尝试拦截服务器的每个请求(无论路径如何)并使用单个Servlet处理。为了使其工作,你的Web应用程序需要在Tomcat中挂载到默认上下文(“ROOT”),并且你的Servlet需要映射到web.xml中的默认Servlet。你的web.xml中的映射是正确的。
<servlet-mapping>
    <servlet-name>Redirect</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

我认为你遇到的问题与ROOT上下文有关。访问www.mydomain.com和www.mydomain.com会显示什么?你没有提到你的共享托管环境是否允许你完全访问自己的Tomcat配置,但如果你可以访问并修改$TOMCAT5_HOME/conf目录,有几种方法可以让这个工作适合你。
可能最干净的方法是添加以下内容:
< Context path="" debug="0" docBase="your-app">

将应用程序称为“your-app.war”,则需要将其部署到$TOMCAT5_HOME/conf/server.xml文件中。

希望这有所帮助。


2
Context path=""或者path="/"有区别吗?我曾经看到过被定义为"/"的情况。 - Taylor Leese

1

<url-pattern>/*</url-pattern>应该可以工作。您的Web应用程序需要部署在根上下文中。默认情况下,Tomcat使用名为ROOT的Web应用程序;但是,您可以将其更改为在server.xml中查找另一个Web应用程序。

另一种方法是创建一个ServletFilter来完成工作,并以相同的方式映射它。每种方法(servlet和servlet filter)都有优缺点。但是,从您的示例中看来,您只想将所有内容发送到另一个站点,因此任何一种方法都可以。


0

模式 /* 一定会调用您的重定向servlet。您是否调试过您的servlet以查看它是否收到了该URL的请求?您所说的“没有工作”是什么意思?您是否遇到任何错误或发生了什么事情?


重定向servlet只接收包含至少一个目录的请求。如果我直接访问域名,例如www.mydomain.com或www.mydomain.com/,则不会调用重定向servlet。重定向servlet按预期工作。我得到的错误是403 Forbidden。但是,如果我在根目录下放置一个index.jsp文件,则不会出现错误。 - leesiulung
如果您不想使用索引页面,可以使用< welcome-file-list >。 - Adeel Ansari
我看到你现在编辑了你的问题。你的Web应用程序没有配置web.xml的上下文名称吗?或者web.xml是Tomcat的根上下文?我怀疑它是否能正常工作。你可以在welcome-file-list中定义index.jsp,并在jsp中将请求重定向到你的servlet。 - Bhushan Bhangale

-1

你试过了吗

<url-pattern>*</url-pattern>

?


1
不,我会尝试一下,但不确定那是否是合法的语法。 - leesiulung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接