web.xml中出现<servlet-name>default</servlet-name>是什么意思?

在web.xml文件中经常看到这样的配置<servlet-name>default</servlet-name>,这个配置的作用是:对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理,如下所示:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ico</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

下面是从http://elf8848.iteye.com/blog/875830中摘录的一些资料

如何你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。

如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。

我们要解决这个问题。

 

目的:可以正常访问静态文件,不可以找不到静态文件报404。

 
方案一:激活Tomcat的defaultServlet来处理静态文件

Xml代码   收藏代码
  1. <servlet-mapping>   
  2.     <servlet-name>default</servlet-name>  
  3.     <url-pattern>*.jpg</url-pattern>     
  4. </servlet-mapping>    
  5. <servlet-mapping>       
  6.     <servlet-name>default</servlet-name>    
  7.     <url-pattern>*.js</url-pattern>    
  8. </servlet-mapping>    
  9. <servlet-mapping>        
  10.     <servlet-name>default</servlet-name>       
  11.     <url-pattern>*.css</url-pattern>      
  12. </servlet-mapping>    
  13. 要配置多个,每种文件配置一个   

要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。


Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default"
Google App Engine 自带的 默认Servlet的名字 -- "_ah_default"
Resin 自带的 默认Servlet的名字 -- "resin-file"
WebLogic 自带的 默认Servlet的名字  -- "FileServlet"
WebSphere  自带的 默认Servlet的名字 -- "SimpleFileServlet" 

 

 


方案二: 在spring3.0.4以后版本提供了mvc:resources ,  使用方法:

Xml代码   收藏代码
  1. <!-- 对静态资源文件的访问 -->    
  2. <mvc:resources mapping="/images/**" location="/images/" />  

  
/images/**映射到ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache 
 
如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

 

使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.
另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
否则无法处理static resources request.

 

 

方案三 ,使用<mvc:default-servlet-handler/>

Xml代码   收藏代码
  1. <mvc:default-servlet-handler/>  

会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回.
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

 

 

补充说明:多个HandlerMapping的执行顺序问题:

DefaultAnnotationHandlerMapping的order属性值是:0

<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping的order属性值是: 2147483646

 

<mvc:default-servlet-handler/>自动注册 的SimpleUrlHandlerMapping 的order属性值是: 2147483647

 

 

spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,因为我们没有叫a.jpg的Action。然后再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定会匹配上,就可以响应图片。


 

访问一个图片,还要走层层匹配。不知性能如何?

最后再说明一下,方案二、方案三 在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。

如何你的DispatcherServlet拦截 *.do这样的URL后缀,就不存上述问题了。还是有后缀方便。


<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.mp3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.mp4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ppt</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.doc</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.docx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xls</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xlsx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.rar</url-pattern> </servlet-mapping> <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>wangzhan/index.jsp</welcome-file> </welcome-file-list> </web-app>
09-09
<think>我们正在讨论Tomcat的web.xml置中的一个具体参数:listings。 根据引用内容,这个参数出现在DefaultServlet置中。 引用[1][2][3]都提到了DefaultServlet置,其中包含: <init-param> <param-name>listings</param-name> <param-value>true</param-value> 或者 false </init-param> 根据引用内容,DefaultServlet是Tomcat用于处理静态资源(如HTML、图片等)的Servlet。它被映射到根路径(url-pattern为"/")。 参数listings的含义:控制当请求一个目录(而不是具体文件)时,是否显示该目录下的文件列表。 具体来说: - 当listings设置为true时,如果请求的是一个目录,且该目录下没有欢迎文件(如index.html),则Tomcat会生成一个包含该目录下所有文件和子目录的HTML列表页面。 - 当listings设置为false时(默认值),如果请求的是一个目录且没有欢迎文件,Tomcat将返回403(禁止访问)错误。 在Tomcat的默认置中(conf/web.xml),listings的值通常设置为false(见引用[2]和[3]中一个为false,一个为true?实际上引用[1]和[3]中写的是true,引用[2]中写的是false,但请注意,引用[2]描述的是覆盖默认置的情况)。 然而,在Tomcat的默认置中(即安装后自带的conf/web.xml),我们通常可以看到listings的默认值是false(为了安全,不推荐开启目录列表)。 引用[4]还提到了JspServlet,它负责处理JSP请求,但与我们讨论的listings参数无关。 因此,总结回答: 置项: <param-name>listings</param-name> <param-value>false</param-value> 代表禁用目录列表功能。这是Tomcat的DefaultServlet的一个初始化参数,用于控制当访问一个目录(且没有欢迎文件)时,是否显示目录内容。 如果不设置(即没有在web.xml中显式置),则DefaultServlet会使用默认值。根据Tomcat官方文档,在Tomcat 7及更高版本中,listings的默认值是false(关闭目录列表)。所以即使不设置,效果也是false。 但是,在Tomcat的默认conf/web.xml中,这个参数是被显式设置为false的(见引用[2]和[3]的对比,引用[3]中写的是true,但实际Tomcat的默认置是false)。这里引用[3]可能是某个特定版本的置,或者示例中写的是true,但通常生产环境我们会设置为false。 注意:这个置在Tomcat的全局web.xml(conf/web.xml)中设置,会影响所有Web应用。但是,单个Web应用可以在自己的web.xml中覆盖这个置(如果它定义了一个同名的DefaultServlet并设置不同的参数值,但通常不会这样做,因为一般不会在自己的应用中重新定义DefaultServlet)。 关于覆盖:引用[2]提到,如果在应用的web.xml置了同名的DefaultServlet(相同的servlet-name和url-pattern),则会覆盖Tomcat默认的DefaultServlet。此时,如果在这个覆盖的DefaultServlet中设置了listings参数,则以该设置为准;如果没有设置,则使用Tomcat的DefaultServlet的默认值(false)。 但通常,我们不建议覆盖DefaultServlet,除非有特殊需求。 因此,回答用户的问题: 这个置项的含义是:是否允许显示目录列表。设置为false表示禁止显示。 不设置会怎么样? 在全局web.xml中,Tomcat已经默认设置了这个参数为false(至少在较新版本中)。如果某个应用在自己的web.xml中没有覆盖DefaultServlet,那么就会使用全局设置(即false)。如果覆盖了但没有设置listings参数,则使用DefaultServlet的默认值(false)。 所以,不设置的话,默认就是false,即禁止目录列表。 生成相关问题: 1. 如何开启Tomcat的目录列表功能? 2. 什么是Tomcat的DefaultServlet?它有什么作用? 3. 如何置Tomcat的欢迎文件(以避免目录列表)? 4. 为什么生产环境中应该关闭目录列表? 回答结构: 1. 解释置项含义 2. 说明默认值 3. 不设置的后果(即使用默认值false) 4. 安全建议 注意:引用标记,在适当的地方引用提供的资料(主要是引用[1][2][3]中关于DefaultServlet置部分)。 </think> ### Tomcat `listings` 置项详解 #### 一、置项含义 在 Tomcat 的 `web.xml` 中,`<param-name>listings</param-name>` 是 `DefaultServlet` 的关键参数,用于**控制目录列表显示行为**: ```xml <init-param> <param-name>listings</param-name> <param-value>false</param-value> <!-- true 或 false --> </init-param> ``` - **`true`**:当请求目录且无欢迎文件时,**显示目录内容列表**(包含文件/子目录的 HTML 列表)[^1][^2][^3] - **`false`**(默认值):当请求目录且无欢迎文件时,**返回 403 禁止访问错误**[^2][^3] #### 二、工作机制示意图 ```mermaid graph TD A[请求目录路径] --> B{目录存在<br>欢迎文件?} B -->|有欢迎文件| C[显示欢迎文件] B -->|无欢迎文件| D{listings值} D -->|true| E[生成目录列表HTML] D -->|false| F[返回403错误] ``` #### 三、不置时的默认行为 1. **Tomcat 默认置** 在 `$CATALINA_HOME/conf/web.xml` 中,Tomcat 已预置: ```xml <param-name>listings</param-name> <param-value>false</param-value> <!-- 默认禁用目录列表 --> ``` 不显式置时,**自动采用默认值 `false`**[^2] 2. **安全影响** 保持默认值 `false` 是安全最佳实践,可防止: - 敏感文件意外暴露(如备份文件、置文件) - 目录结构信息泄露(被攻击者用于路径探测) #### 四、何时需要启用(true) | 场景 | 说明 | 风险提示 | |------|------|----------| | 开发环境调试 | 快速查看静态资源目录结构 | 生产环境必须禁用 | | 文件服务器 | 提供类似FTP的目录浏览功能 | 需额外置访问控制 | | 旧系统兼容 | 无欢迎文件的遗留系统临时方案 | 建议添加欢迎文件替代 | #### 五、置示例 **启用目录列表(开发环境)**: ```xml <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>listings</param-name> <param-value>true</param-value> <!-- 启用目录列表 --> </init-param> <load-on-startup>1</load-on-startup> </servlet> ``` > **安全建议**:生产环境务必保持 `listings=false`,并通过置 `welcome-file-list` 指定默认访问文件(如 `index.html`): > ```xml > <welcome-file-list> > <welcome-file>index.html</welcome-file> > <welcome-file>index.jsp</welcome-file> > </welcome-file-list> > ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值