嘘~ 正在从服务器偷取页面 . . .

Web.xml 配置


Web.xml 配置

一、认识

一般在Eclipse 或者 Idea / STS 等开发工具中创建web工程,使用使用到web模块就会生出一个web.xml 文件。web.xml 文件主要用来配置Welcome页面servlet-mappingFilterListenerServletSessioncache、启动加载先后等许多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 所有应用默认的部署描述文件,主要是定义基础默认的 servletMIME映射相关信息。如果用户的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.xmlcontext.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:DefaultServletJspServlet,前者是默认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规范中,可以使用定义Web应用的环境参数,方式如下:


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>

用于声明一个对外部资源的引用。其中res-ref-name指定资源管理链接工厂 的引用名称。是一个相对于java/comp/env的JNDI名称o res-type指定数据源的类型,为数据源Java 类或实现接口的完全限定名称ores-auth确定是由Web应用代码登录资源管理器还是由容器登录, 属性值必须为Application或者Container。res-sharing-scope用于指定从资源管理器链接工厂中获 取的链接是否可以共享。

示例如下:

  <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架构解析》或其他相关资料。



版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录