Tomcat的配置管理篇2-Web应用配置

欢迎大家关注 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-namefilter-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架构解析

猜你喜欢

转载自juejin.im/post/7085344060549890084