禁用激活器servlet
在对资源应用过滤器时,可通过指定要应用过滤器的URL模式或servlet名来完成。如果提供servlet名,则此名称必须与web.xml的 servlet元素中给出的名称相匹配。如果使用应用到一个serlvet的URL模式,则此模式必须与利用web.xml的元素servlet- mapping指定的模式相匹配。但是,多数服务器使用“激活器servlet”为servlet体统一个缺省的URL:http: //host/WebAppPrefix/servlet/ServletName。需要保证用户不利用这个URL访问servlet(这样会绕过过滤器 设置)。
例如,假如利用filter和filter-mapping指示名为SomeFilter的过滤器应用到名为SomeServlet的servlet,则如下:
在对资源应用过滤器时,可通过指定要应用过滤器的URL模式或servlet名来完成。如果提供servlet名,则此名称必须与web.xml的 servlet元素中给出的名称相匹配。如果使用应用到一个serlvet的URL模式,则此模式必须与利用web.xml的元素servlet- mapping指定的模式相匹配。但是,多数服务器使用“激活器servlet”为servlet体统一个缺省的URL:http: //host/WebAppPrefix/servlet/ServletName。需要保证用户不利用这个URL访问servlet(这样会绕过过滤器 设置)。
例如,假如利用filter和filter-mapping指示名为SomeFilter的过滤器应用到名为SomeServlet的servlet,则如下:
<
filter
>
< filter-name > SomeFilter </ filter-name >
< filter-class > somePackage.SomeFilterClass </ filter-class >
</ filter >
<!-- ... -->
< filter-mapping >
< filter-name > SomeFilter </ filter-name >
< servlet-name > SomeServlet </ servlet-name >
</ filter-mapping >
< filter-name > SomeFilter </ filter-name >
< filter-class > somePackage.SomeFilterClass </ filter-class >
</ filter >
<!-- ... -->
< filter-mapping >
< filter-name > SomeFilter </ filter-name >
< servlet-name > SomeServlet </ servlet-name >
</ filter-mapping >
接着,用servlet和servlet-mapping规定URL http://host/webAppPrefix/Blah 应该调用SomeSerlvet,如下所示:
<
filter
>
< filter-name > SomeFilter </ filter-name >
< filter-class > somePackage.SomeFilterClass </ filter-class >
</ filter >
<!-- ... -->
< filter-mapping >
< filter-name > SomeFilter </ filter-name >
< servlet-name >/Blah </ servlet-name >
</ filter-mapping >
< filter-name > SomeFilter </ filter-name >
< filter-class > somePackage.SomeFilterClass </ filter-class >
</ filter >
<!-- ... -->
< filter-mapping >
< filter-name > SomeFilter </ filter-name >
< servlet-name >/Blah </ servlet-name >
</ filter-mapping >
现在,在客户机使用URL http://host/webAppPrefix/Blah 时就会调用过滤器。过滤器不应用到
http://host/webAppPrefix/servlet/SomePackage.SomeServletClass。
尽管有关闭激活器的服务器专用方法。但是,可移植最强的方法时重新映射Web应用钟的/servlet模式,这样使所有包含此模式的请求被送到相同的 servlet中。为了重新映射此模式,首先应该建立一个简单的servlet,它打印一条错误消息,或重定向用户到顶层页。然后,使用servlet和 servlet-mapping元素发送包含/servlet模式的请求到该servlet。程序清单9-1给出了一个简短的例子。
程序清单9-1 web.xml(重定向缺省servlet URL的摘录)
<?
xml version="1.0" encoding="ISO-8859-1"
?>
<! DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
<!-- ... -->
< servlet >
< servlet-name > Error </ servlet-name >
< servlet-class > somePackage.ErrorServlet </ servlet-class >
</ servlet >
<!-- ... -->
< servlet-mapping >
< servlet-name > Error </ servlet-name >
< url-pattern > /servlet/* </ url-pattern >
</ servlet-mapping >
<!-- ... -->
</ web-app >
<! DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
<!-- ... -->
< servlet >
< servlet-name > Error </ servlet-name >
< servlet-class > somePackage.ErrorServlet </ servlet-class >
</ servlet >
<!-- ... -->
< servlet-mapping >
< servlet-name > Error </ servlet-name >
< url-pattern > /servlet/* </ url-pattern >
</ servlet-mapping >
<!-- ... -->
</ web-app >