欢迎大家关注 github.com/hsfxuebao ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
web.xml是Web应用的部署描述文件
,它支持的元素及属性来自于Servlet规范定义。在Tomcat中,Web应用的部署描述信息包括$CATALINA BASE/conf/web.xml中的默认配置以及Web应用WEB-INF/web.xml下的定制配置
(暂不考虑web-fragment.xml等模块化机制)。Tomcat的默认配置比Web应用定制配置要复杂得多,如果是一个完全基于JSP的Web应用甚至可以不用添加任何定制配置。本节在讲解web.xml规范配置的同时,也会对Tomcat提供的默认配置进行说明。
Web应用部署描述文件的根元素为<web-app>,其支持的所有子元素如下(基于Servlet规范3.1):
<?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_3_1.xsd"
id="WebApp ID"version="3.1">
<absolute-ordering></absolute-ordering>
<administered-object></administered-object>
<connection-factory></connection-factory>
<context-param></context-param>
<data-source></data-source>
<deny-uncovered-http-methods></deny>
<description></description>
<display-name></display-name>
<ejb-local-ref></ejb-local-ref>
<ejb-ref> </ejb-refx>
<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>
复制代码
部分元素尽管在xsd文件中存在定义,但是并未出现在Servlet规范中,或者Tomcat并未支持,对于这部分属性,本书不再进行介绍。
Web部署描述文件的配置主要分为如下几类:
- ServletContext初始化参数
- 会话配置
- Servlet声明及映射
- 应用生命周期监听器
- Filter定义及映射
- MIME类型映射
- 欢迎文件列表
- 错误页面
- 本地化及编码映射
- 安全配置
- JNDI配置
Servlet规范明确要求Servlet容器必须支持除JNDI配置外的其他所有分类。接下来我们按照分类逐一对Web应用部署描述文件支持的元素进行说明。
1. ServletContext初始化参数
我们可以通过\<context-param>添加ServletContext初始化参数
,它配置了一个键值对,这样我们便可以在应用程序中使用javax.servlet.ServletContext.getInitParameter()
方法,通过指定的键获取参数值,以控制应用程序的行为。我们可以使用它配置加载文件路径、应用运行状态(开发、测试、生产)以及日志等。其配置方式如下,可以同时配置多个初始化参数。
<context-param>
<description>The servletContext parameter</description>
<param-name>name</param-name>
<param-value>The parameter value</param-value>
</context-param>
复制代码
<description>不是必需的,但是在实际开发过程中建议保留参数描述,以提高系统可维护性。
2. 会话配置
<session-config>用于配置Web应用会话,包括超时时间、Cookie配置以及会话追踪模式。它将覆盖server.xml和context.xml中的配置。完整示例如下:
<session-config>
<session-timeout>30</session-timeout>
<cookie-config>
<name>JSESSIONID</name>
<domain>sample.myApp.com</domain>
<path>/</path>
<comment>The session cookie</comment>
<http-only>true</http-only>
<secure>true</secure>
<max-age>3600</max-age>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
复制代码
<session-timeout>
用于配置会话超时时间,单位为分钟。
<cookie-config>
用于配置会话追踪Cookie,需要关注的是http-only和secure,这两个属性主要用来控制Cookie的安全性。只有当会话追踪模式是Cookie时,该配置才会生效(Tomcat默认支持通过Cookie追踪会话)。此外,<domain>
用于配置当前Cookiel所处的域,path用于配置Cookie所处的相对路径。
<tracking-mode>用于配置会话追踪模式,即通过何种方式从请求中获得会话标识(可配置多个),Servlet规范3.`支持3种追踪模式:COOKIE、URL、SSL。
-
COOKIE
:通过HTTP Cookie追踪会话是最常用的会话追踪机制,而且Servlet规范也要求所有Servlet容器实现均需要支持Cookie追踪。当首次发起HTTP请求时,Servlet容器会发送一个用于会话的Cookie(会话标识)到客户端,在后续的请求中,客户端会将该Cookie返回到服务端,服务端根据该Cookie确定请求会话。默认情况下,Cookie的名称为JSESSIONID,可以通过<Context>
的sessionCookieName属性或者<cookie-config>
的name属性修改,前者优先级更高。 -
URL
:URL重写是最基本的会话追踪机制。当客户端不支持Cookie时,可以采用URL重写的方式。当采用URL追踪模式时,请求路径需要包含会话标识信息,Servlet容器会根据路径中的会话标识设置请求的会话信息。Servlet规范要求会话标识必须为URL路径参数,参数名为jsessionid,如http:/www.myserver.com/catalog/ind… URL重写会将会话标识暴露到日志、书签、HTTP referer头信息、缓存的HTML页面、浏览器URL条等,因此如果可以使用Cookie或者SSL会话,尽量不要使用URL重写。 -
SSL
: 对于SSL请求,通过SSL会话标识确定请求会话标识。
Tomcat在$CATALINA_BASE/conf/web.xml中添加了<session-config>
,仅指定了会话超时时间,默认为30分钟。
Tomcat默认支持Cookie和URL两种方式的会话追踪,如支持SSL,需要按照上面的描述添加 配置。
一旦添加了<tracking-mode>,必须确保包含所有要支持的追踪模式,不可以只配置SSL,否则意味着Web应用仅支持SSL追踪。
3. Servlet声明及映射
以下是对Servlet声明及映射配置的介绍,包含<servlet>和<servlet-mapping>两部分。
3.1 <servlet>
该元素用于声明一个Servlet.,常见配置如下:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>org.myapp.servlet.MainServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
复制代码
-
servlet-name
:用于指定Servlet名称
,该属性必须指定,而且在web.xml中必须唯一。 -
servlet-class
:用于指定Servlet类名
,当Servlet指向单一的JSP页面时,并不需要指定servlet-class,此时只需要通过jsp-file属性指定JSP文件相对于Web应用根目录的路径即可。 -
init-param
:用于指定Servlet初始化参数
,在应用中可以通过javax.servlet.http.HttpServlet,getInitParameter获取。同一个Servleti可以添加多个初始化参数。 -
load-on-startup
:用于控制在Web应用启动时,Servlet的加载顺序
。如果值小于0,在Web应用启动时,将不加载该Servlet。
除了上述属性外,<servlet>还支持以下属性:
-
async-supported
:用于指定当前Servlet是否启用异步处理
,取值为true或者false,默认为false。异步处理的知识具体参见“Servlet规范3.1”。异步处理有利于在并发量较大时,及早释放Servlet资源,提升系统性能。该属性仅用于标识Servlet是否支持异步处理,如果希望请求处理异步,还需要在Servlet中增加相关处理代码。感兴趣的可以进一步了解javax.servlet.AsyncContext的使用方法。
-
multipart-config
:用于指定Servlet上传文件请求配
置,包括文件大小限制、请求大小限
制以及文件写到磁盘的阈值(文件大小超过该值后将写到磁盘)。
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>org.myapp.servlet.MainServlet</servlet-class>
<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>
<load-on-startup>1</load-on-startup>
</servlet>
复制代码
-
enabled
:用于标识当前Servlet是否启用
。如果为false,那么当前Servlet将不处理任何请求(返回404)。 -
run-as
:用于标识访问当前Servlet所需的安全角色
,用于进行安全控制. -
security-role-ref
:用于声明Web应用中使用的安全角色的引用
,role-name指定代码中
使用的角色名称,role-link为role-name指向的服务器配置角色名称(tomcat-.user.xml)。
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>org.myapp.servlet.MainServlet</servlet-class>
<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>1</load-on-startup>
</servlet>
复制代码
3.2 <servlet-mapping>
用于定义Servlet与URL表达式之间的映射关系。
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>*.do</url-pattern>
<url-pattern>/myapp/*</url-pattern>
</servlet-mapping>
复制代码
servlet-name
:用于指定映射对应的Servlet名称
。url-pattern
:用于指定URL表达式,一个<servlet-mapping>可以同时配置多个url-pattern
。
通过前面几章的讲解我们知道,Tomcat在$CATALINA BASE/conf/web.xml
中默认添加了两 个Servlet:DefaultServlet和JspServlet,前者作为默认Servlet用于处理静态资源请求,后者用于处 理JSP页面请求。
4. 应用生命周期监听器
<listener>用于添加Web应用生命周期监听器
,可以同时配置多个。监听器必须实现javax.servlet.ServletContextListener接口。Web应用启动时会调用监听器的contextInitialized()方法,停止时调用其contextDestroyed()方法
。启动时,ServletContextListener的执行顺序与web.xm中的配置顺序一致,停止时执行顺序恰好相反。其配置示例如下:
<listener>
<listener-class>org.myapp.servlet.MyAppListener</listener-class>
</listener>
复制代码
5. Filter定义及映射
<filter>用于配置Wb应用过滤器,用来过滤资源请求及响应。经常用于认证、日志、加密、数据转换等。其配置示例如下:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>org.myapp.servlet.MyFilter</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.Fi1lter接口。async-supported
:用于配置过滤器是否支持异步
,同Servlet。init-param
:用于配置过滤器初始化参数,可以配置多个
,在过滤器中通过javax.servlet.FilterConfig,getInitParameter获取。
除filter-name
和filter-class
外,其他配置均非必需。
添加过滤器后,我们还需要通过<filter-mapping>配置与其匹配的Servlet或者URL的映射。
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/myApp/*</url-pattern>
</filter-mapping>
复制代码
filter-name
:指向一个有效的过滤器。url-pattern
:用于指定该过滤器可以处理的URL表达式。只有符合该表达式的请求URL,当
前过滤器才会处理。
除了url-pattern,我们还可以通过设置servlet-name,使过滤器只处理指定Servlet的请求。
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>myServlet</servlet-name>
</filter-mapping>
复制代码
6. MIME类型映射
MME(Multipurpose Internet Mail Extensions)即多用途互联网邮件扩展类型,用于设定某类型的扩展名文件将采用何种应用程序打开。当我们通过请求访问该扩展名的资源文件时,浏览器将自动使用指定的应用程序打开返回的资源文件。多用于客户端自定义的文件名,如Word、Excel等。
<mime-mapping>
用于为当前Web应用指定MME映射。
<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>
复制代码
如上,我们指定使用MS Word打开doc文档。Tomcat在SCATALINA_BASE/conf/web.xml中已经为我们添加了绝大多数文档类型的MME映射,因此一般并不需要额外配置该信息。假使存在新的类型的文档需要处理,我们只需要在WEB-NF/web.xml中添加即可。
7. 欢迎文件列表
<welcome-file-list>
用于指定Web应用的欢迎文件列表。当请求地址为Web应用根地址时,服务器会尝试在请求地址后加上欢迎文件并进行请求定向。
<welcome-file-list>
<welcome-file>index.do</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
复制代码
如上,如果我们访问Web应用的根地址http://localhost:8080/myApp ,服务器会先尝试匹配 http://localhost:8080/myApp/index.do, 如未找到符合条件的Servlet,则会进一步匹配http://localhost:8080/myApp/index.jsp, 以此类推。
8.错误页面
<error-page>用于配置Web应用访问异常时定向到的页面,支持HTTP响应码和异常类型两种形式。
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<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. 安全配置
通过web.xml中的安全配置,可以为Web应用增加页面访问权限。本节仅简单讲解Web应用中的配置方式。
-
<security-role>
:为Web应用添加一个角色。 -
<login-config>
:指定Web应用的认证方式,当前支持BASIC、DIGEST、FORM、CLIENT-CERT这4种方式。 -
<security-constraint>
:指定针对符合url-patterni的请求进行安全约束,粒度可以控制到具体的htp-method。 -
<deny-uncovered-http-methods>
:用于指定对于中未包含的htp-method是否允许访问。如不配置,这些http-method将可以被所有用户访问。
示例如下:
<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>
复制代码
<security-constraint>和<security-role>
可以同时添加多个,以便对不同目录下的请求进行 不同的权限控制。
参考文章
tomcat-9.0.60-src源码解析
Tomcat架构解析