Web.xml 配置
一、认识
一般在Eclipse 或者 Idea / STS 等开发工具中创建web工程,使用使用到web模块就会生出一个web.xml
文件。web.xml
文件主要用来配置Welcome页面
、servlet-mapping
、Filter
、Listener
、Servlet
、Session
、cache
、启动加载先后等许多web应用使用的东东。
传统的单体应用一般是使用web.xml来进行配置的,当然web.xml并不是必须的,比如SpringBoot就是没有web.xml的。
web.xml
默认的位置是在工程的WEB-INF路径下,在Servlet2.5规范之前,每个应用都必须包含一个web.xml文件,且必须放在WEB-INF路径下。 我猜测这Servlet规范相关的,Tomcat 就是一直很流行且使用较为广泛的Servlet规范。
在Tomcat目录中有有个conf/
目录中就存在web.xml
文件,该文件的作为 Tomcat 所有应用默认的部署描述文件,主要是定义基础默认的 servlet
和 MIME
映射相关信息。如果用户的web应用也有web.xml
配置文件,应用启动运行时就会将默认部署描述和自定义配置的web.xml进行合并 ,让Servlet 容器也能加载使用我们自己定义的Servlet信息。(参考刘光瑞版《Tomcat架构解析》。)
二、主要内容
web.xml
是Web 应用的部署描述文件,支持的元素来自Servlet规范定义。
0、完整的Web.xml
完整的Web应用支持的元素。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0" id="WebApp_ID">
<absolute-ordering></absolute-ordering>
<administered-object></administered-object>
<connection-factory></connection-factory>
<context-param></context-param>
<data-source></data-source>
<deny-uncovered-http-methods/>
<description></description>
<display-name></display-name>
<ejb-local-ref></ejb-local-ref>
<ejb-ref></ejb-ref>
<env-entry></env-entry>
<error-page></error-page>
<filter></filter>
<filter-mapping></filter-mapping>
<icon></icon>
<jms-connection-factory></jms-connection-factory>
<jms-destination></jms-destination>
<jsp-config></jsp-config>
<listener></listener>
<locale-encoding-mapping-list></locale-encoding-mapping-list>
<login-config></login-config>
<mail-session></mail-session>
<message-destination></message-destination>
<message-destination-ref></message-destination-ref>
<mime-mapping></mime-mapping>
<module-name></module-name>
<persistence-context-ref></persistence-context-ref>
<persistence-unit-ref></persistence-unit-ref>
<post-construct></post-construct>
<pre-destroy></pre-destroy>
<resource-env-ref></resource-env-ref>
<resource-ref></resource-ref>
<security-constraint></security-constraint>
<security-role></security-role>
<service-ref></service-ref>
<servlet></servlet>
<servlet-mapping></servlet-mapping>
<session-config></session-config>
<welcome-file-list></welcome-file-list>
</web-app>
Web部署描述文件的配置主要分为如下几类:
- ServletContext初始化参数
- 会话配置
- Servlet声明及映射
- 应用生命周期监听器
- Filter定义及映射
- MIME类型映射
- 欢迎文件列表
- 错误页面
- 本地化及编码映射
- 安全配置
- JNDI 配置
Servlet规范明确要求Servlet容器必须支持除JNDI配置外的其他所有分类。
1、ServletContext 初始化参数
<context-param>
<description>ServletContext 初始化参数的描述</description>
<param-name>name</param-name>
<param-value>The parameter value</param-value>
</context-param>
<description>
标签非必需,但是建议保留,方便维护。
2、会话配配
<session-config>
标签用于配置Web应用会话,包括超时时间、Cookie配置以及会话追踪模式。
如果配置该项,将会覆盖tomcat配置里server.xml
和 context.xml
中的配置。
<session-config>
<!-- 配置会话超时时间,单位为分钟 -->
<session-timeout>30</session-timeout>
<!-- 会话追踪Cookie -->
<cookie-config>
<name>JSESSIONID</name>
<!-- 配置当前Cookie所处的域 -->
<domain>hut.zhangxiaocai.com</domain>
<path>/</path>
<comment>The session cookie</comment>
<http-only>true</http-only>
<secure>true</secure>
<max-age>36OO</max-age>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
<session-timeout>
:配置会话超时时间,单位为分钟。如果不配置,在tomcat/conf/web.xml
默认的配置了<session-config>
,仅指定了会话超时时间,默认为30分钟。
<cookie-config>
:会话追踪Cookie相关配置。
<http-only>
和<secure>
:两个属性主要用来控制Cookie的安全性。只有当会话追踪模式是Cookie时,该配置才会生效(Tomcat默认支 持通过Cookie追踪会话) 。
<domain>
:配置当前Cookie所处的域
<tracking-mode>
:Servlet规范3.1支持3种会话追踪模式支持:COOKIE、URL, SSL。
- COOKIE:
通过HTTP Cookie追踪会话是最常用的会话追踪机制,Servlet规范也要求所有Servlet容器实现均需要支持Cookie追踪。当首次发起HTTP请求时,Servlet容器会发送一个用于会话的Cookie (会话标识)到客户端,在后续的请求中,客户端会将该Cookie 返回到服务端,服务端根据该Cookie确定请求会话。
默认情况下,Cookie的名称为 JSESSIONID,可以通过
<Context>
的sessionCookieName属性或者的name 属性修改,前者优先级更高。
- URL
URL重写是最基本的会话追踪机制。当客户端不支持Cookie时,可以采用URL重写 的方式。当釆用URL追踪模式时,请求路径需要包含会话标识信息,Servlet容器会根据路径中的会话标识设置请求的会话信息。Servlet规范要求会话标识必须为URL路径参数,参数名为
jsessionid
,如http://www.myserver.com/catalog/index.html;jsessionid=1234。URL重写会将会话标识暴露到日志、书签、HTTP referer头信息、缓存的HTML页面、浏览器URL 条等,因此如果可以使用Cookie或者SSL会话,尽量不要使用URL重写。
- SSL
对于SSL请求,通过SSL会话标识确定请求会话标识。
Tomcat默认支持Cookie和URL两种方式的会话追踪,如支持SSL,需要按照上面的描述添加 配置。一旦添加了<tracking-mode>
,必须确保包含所有要支持的追踪模式,不可以只配置SSL,否则意味着Web应用仅支持SSL追踪。
意思就是想配置了SSL,最好把COOKIE配置也使用上,否则COOKIE将不会起作用,只能使用SSL追踪。
3、Servlet声明及映射
先看完整配置:
<!-- Servlet声明 -->
<servlet>
<servlet-name>xiaocaiServlet</servlet-name>
<servlet-class>com.xiaocai.servlet.LoginServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
<multipart-config>
<max-file-size>10485760</max-file-size>
<max-request-size>10485760</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
<async-supported>false</async-supported><!-- 异步支持,默认就是false -->
<enable>true</enable>
<run-as>
<role-name>admin</role-name>
</run-as>
<security-role-ref>
<role-name>admin</role-name>
<role-link>manager</role-link>
</security-role-ref>
<load-on-startup>l</load-on-startup>
</servlet>
<!-- Servlet映射 -->
<servlet-mapping>
<servlet-name>xiaocaiServlet</servlet-name>
<url-pattern>*.do</url-pattern>
<url-pattern>/xiaocaiApp/*</url-pattern>
</servlet-mapping>
Servlet 声明块:
<servlet-name>
:用于指定Servlet名称,该属性必须指定,而且在web.xml
中必须唯一。<servlet-class>
:用于指定Servlet类名,如果Servlet指向单一的JSP页面时,并不需要指定 servlet-class,此时只需要通过jsp-file属性指定JSP文件相对于Web应用根目录的路径即可。<init-param>
:用于指定Servlet初始化参数,在应用中可以通过javax.servlet.http.HttpServlet.getlnitParameter
获取。同一个Servlet可以添加多个初始化参数。<load-on-startup>
:用于控制在Web应用启动时,Servlet的加载顺序。如果值小于0,在Web 应用启动时,将不加载该Servlet。<multipart-config>
:用于指定Servlet上传文件请求配置,包括文件大小限制、请求大小限 制以及文件写到磁盘的阈值(文件大小超过该值后将写到磁盘)。<async-supported>
:用于指定当前Servlet是否启用异步处理,取值为true或者false,默认为false。异步处理的知识具体参见“Servlet规范3.1”。异步处理有利于在并发量较大时, 及早释放Servlet资源,提升系统性能。
注意该属性仅用于标识Servlet是否支持异步处理,如果希望请求处理异步,还需要在Servlet中 增加相关处理代码,具体使用参考
javax.servlet.AsyncContext
的使用方法。
<enable>
:用于标识当前Servlet是否启用。如果为false,那么当前Servlet将不处理任何请 求(返回404)。<run-as>
:用于标识访问当前Servlet所需的安全角色,用于进行安全控制,具体参见第9章 Tomcat 安全。<security-role-ref>
:用于声明Web应用中使用的安全角色的引用,<role-name>
指定代码中使用的角色名称,<role-name>
和<role-link>
指向的服务器配置角色名称(tomcat-users.xml
)。
servlet-mapping 映射块:
<servlet-name>
:用于指定映射对应的Servlet名称。<url-pattern>
:用于指定URL表达式,一个<servlet-mapping>
可以同时配置多个<url-pattern>
。Tomcat中默认添加了两 个Servlet:DefaultServlet
和JspServlet
,前者是默认Servlet用于处理静态资源请求,后者用于处理JSP页面请求。
4、应用监听器
应用监听器,其实就是应用的生命周期内使用的监听器。
比如,启用spring容器的监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
比如,log4j日志的监听器
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<listener>
用于添加Web应用生命周期监听器,可以同时配置多个。
注意:监听器必须实现javax. servlet.ServletContextListener
接口。
Web应用启动时会调用监听器的contextlnitialized()
方法,停止时调用其contextDestroyed()
方法。启动时,ServletContextListener的执行顺序与 web.xml中的配置顺序一致,停止时执行顺序恰好相反。
5、Filter定义及映射
<filter>
用于配置Web应用过滤器,用来过滤资源请求及响应。经常用于认证、日志、加密、数据转换等。
<filter>
<filter-name>xiaocaiFilter</filter-name>
<filter-class>com.xiaocai.servlet.xiaocaiFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
</filter>
<filter-name>
:用于指定过滤器名称,在部署描述文件中,过滤器名称必须唯一。<filter-class>
:用于指定过滤器实现类,必须实现javax.servlet.Filter
接口。<async-supported>
:用于配置过滤器是否支持异步,参考Servlet中关于异步支持的描述。<init-param>
:用于配置过滤器初始化参数,可以配置多个,在过滤器中通过javax.servlet. FilterConfig.getInitParameter(String name)
获取。
除<filter-name>
和<filter-class>
外,其他配置均非必需。
添加过滤器后,我们还需要通过<filter-mapping>
配置与其匹配的Servlet或者URL的映射。
<!-- xiaocaiFilter 过滤器处理 URL 中 /xiaocaiApp 的请求-->
<filter-mapping>
<filter-name>xiaocaiFilter</filter-name>
<url-pattern>/xiaocaiApp/*</url-pattern>
</filter-mapping>
<filter-name>
:指向一个有效的过滤器。<url-pattern>
:用于指定该过滤器可以处理的URL表达式。只有符合该表达式的请求URL,当前过滤器才会处理。
除了url-pattern
,我们还可以通过设置servlet-name
,使过滤器只处理指定Servlet的请求。
<!-- xiaocaiFilter 过滤器只处理 xiaocaiServlet 的请求-->
<filter-mapping>
<filter-name>xiaocaiFilter</-filter-name>
<servlet-name>xiaocaiServlet</servlet-name>
</filter-mapping>
6、MIME类型映射
<mime-mapping>
用于为当前Web应用指定MIME映射。
MIME ( Multipurpose Internet Mail Extensions ):多用途互联网邮件扩展类型,用于设定某类型的扩展名文件将采用何种应用程序打开。当我们通过请求访问该扩展名的资源文件时,浏览 器将自动使用指定的应用程序打开返回的资源文件。多用于客户端自定义的文件名,如Word、 Excel 等。
<!-- 指定使用MS Word打开doc文档。-->
<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>
在tomcat/conf7web.xml
中已经为默认配置了绝大多数文档类型的MIME映射,因此一般并不需要额外配置该信息。如果需要额外添加,按照此格式即可。
7、欢迎文件列表
<welcome--file-list>
用于指定Web应用的欢迎文件列表。当请求地址为Web应用根地址时, 服务器会尝试在请求地址后加上欢迎文件并进行请求定向,找不到时会按此列表配置依次尝试。
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
8、错误页面
<error-page>
用于配置Web应用访问异常时定向到的页面,支持HTTP响应码和异常类型两种形式。
<!-- HTTP 响应码自定义错误页面 -->
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<!-- Exception 自定义错误页面 -->
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
9、本地化及编码映射
<locale-encoding-mapping-list>
用于指定本地化与响应编码的映射关系,如果未显式地指明响应编码,服务器将按照当前本地化信息确定响应编码。
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>zh</locale>
<encoding>GBK</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
字符集编码也可以使用字符集过滤器。
10、安全配置
<security-constraint>
<display-name>user-constaint</display-name>
<web-resource-collection>
<web-resource-name>user-constaint</web-resource-name>
<url-pattern>*.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>PUT</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-role>
<role-name>user</role-name>
</security-role>
<deny-uncovered-http-methods/>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
通过web.xml中的安全配置,可以为Web应用增加页面访问权限。
<security-constraint>
:指定针对符合url-pattem
的请求进行安全约束,粒度可以控制到具体的http-method
。<security-role>
:为Web应用添加一个角色。<login-config>
:指定Web应用的认证方式,当前支持BASIC . DIGEST . FORM、 CLIENT-CERT 这 4 种方式。<deny-uncovered-http-methods/>
:用于指定对于<security-constraint>
中未包含的http-method是否允许访问。如不配置,这些http-method
将可以被所有用户访问。
<security-constraint>
和<secuTity-role>
可以同时添加多个,以便对不同目录下的请求进行 不同的权限控制。
11、JNDI
(1)<env-entry>
在Servlet规范中,可以使用
sql_type
mysql
java.lang.String
env-entry-name
用于指定环境参数的名称,env-entry-value
用于指定环境参数的值,env-entry-type
用于指定环境参数的类型。在Web应用中,我们可以通过如下方式获取环境参数:
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env");
String paramValue = (String)envCtx.lookup(paramName);
(2)<service-ref>
<service-ref>
用于声明一个Web Service引用。
<service-ref>
<description>My App Service Client</description>
<display-name>My App Service Client</display-name>
<service-ref-name>services/appService</service-ref-name>
<service-interface>javax.xml.rpc.Service</service-interface>
<wsdl-file>WEB-INF/wsdl/appService.wsdl</wsdl-file>
<jaxrpc-mapping-file>WEB-INF/serviceMapping.xml</jaxrpc-mapping-file>
<service-qname>
<namespacellRI>http://ws.myapp.com</namespaceURI>
<localpart>MyAppService</localpart>
</service-qname>
<port-component-ref>
<service-endpoint-interface>org.myapp.service.MyAppService</service-endpoint-interface>
<port-component-link>MyAppServicePort</port-component-link>
</port-component-ref>
<handler>
<handler-name>MyAppServiceHandler</handler-name>
<handler-class>org.myapp.service.MyAppServiceHandler</handler-class>
<init-param>
<param-name>localState</param-name>
<param-value>OH</param-value>
</init-param>
<soap-header>
<namespaceURI>http://ws.myapp.com</namespaceURI>
<localpart>MyAppServiceHeader</localpart>
</soap-header>
<soap-role>http://actor.ws.myapp.com</soap-role>
<port-name>myServicePort</port-name>
</handler>
</service-ref>
service-ref-name:用于指定Web Service引用名称以供系统使用时查找,建议以“/service/” 开头。
service-interface:用于指定当前客户端依赖的JAX-RPC服务接口的完全限定名。
wsdl-file:用于指定WSDL文件的URI相对路径(相对于Web应用根目录)。
jaxrpc-mapping-file:用于指定应用程序使用的Java接口与WSDL文件描述中的Java接口 之间的JAX-RP C映射文件。
service-qname:用于指定WSDL服务元素的名称。
port-component-reference:用于声明服务Endpoint接口或者提供一个指向端口组件的链 接。其中,子元素service-endpoint-interface用于指定一个服务Endpoint接口的完全限 定名称。子元素port-component-link为指向一个特定端口组件的引用链接。
handler:用于声明端口组件的处理器。其中,子元素handler-name用于指定处理器名称, 处理器名称必须唯一。handler-class用于指定处理器Java类的完全限定名称。init-param 用于指定处理器的初始化参数。soap-header用于指定当前处理器处理的SOAP头的完全 限定名称(qName )。soap-role用于指定当前处理器将充当的SOAP角色。port-name用 于定义与处理器关联的WSDL端口 。
(3)<resource-ref>
示例如下:
<resource-ref>
<res-ref-name>jdbc/MyDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
此处只列举3个,更多JNDI 相关参数参考《tomcat架构解析》或其他相关资料。
12、其他
(1) <absolute-ordering>
<absolute-ordering>
用于指定web-fragment的顺序。自3.0版本开始,Servlet规范通过web-fragment实现Web应用的插件化。web-fragment的加载顺序会影响Web应用的运行,如ServletContextListener
即按照加载顺序执行,因此Servlet规范支持通过两种方式配置web-fragment的加载顺序: 一是在 web-fragment.xm
中通过 <ordering>
指定,二是在 web.xm
中通过<absolute-ordering>
指定。
示例:
<absolute-ordering>
<name>WebFragmentl</name>
<name>WebFragment2</name>
</absolute-ordering>
(2)<distributable>
<distributable>
该元素无任何属性,用于表明当前Web应用是否是分布式应用。当添加该配 置后,Tomcat会针对分布式做一些处理或限制(如要求会话属性必须可串行化)。
(3)<message-destination>
<message-destination>
用于指定一个逻辑消息目的地址,它会映射到部署环境中一个有效 的物理目的地址。其子元素message-destination-name
用于指定消息目的地址的名称。示例如下:
<message-destination>
<message-destination-name>CorporateStocks</message-destination-name>
</message-destination>
还有<jsp-config>
、<icon>
等就使用少的不再列举,可以参考《tomcat架构解析》或其他相关资料。