主頁 > 軟體設計 > web.xml 中的listener、 filter、servlet 加載順序及其詳解

web.xml 中的listener、 filter、servlet 加載順序及其詳解

2020-09-12 08:35:49 軟體設計

轉載自:https://www.cnblogs.com/Jeely/p/10762152.html


 

一、概述

1、啟動一個WEB專案的時候,WEB容器會去讀取它的組態檔web.xml,讀取<listener>和<context-param>兩個結點, 

2、緊急著,容創建一個ServletContext(servlet背景關系),這個web專案的所有部分都將共享這個背景關系, 

3、容器將<context-param>轉換為鍵值對,并交給servletContext, 

4、容器創建<listener>中的類實體,創建監聽器,

二 、 load-on-startup

load-on-startup 元素在web應用啟動的時候指定了servlet被加載的順序,它的值必須是一個整數,如果它的值是一個負整數或是這個元素不存在,那么容器會在該 servlet被呼叫的時候,加載這個servlet ,如果值是正整數或零,容器在配置的時候就加載并初始化這個servlet,容器必須保證值小的先被加載,如果值相等,容器可以自動選擇先加載誰,  

在servlet的配置當中,<load-on-startup>5</load-on-startup>的含義是: 

標記容器是否在啟動的時候就加載這個servlet, 

當值為0或者大于0時,表示容器在應用啟動時就加載這個servlet; 

當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載, 

正數的值越小,啟動該servlet的優先級越高, 

三  、加載順序

首先可以肯定的是,加載順序與它們在 web.xml 檔案中的先后順序無關,即不會因為 filter 寫在 listener 的前面而會先加載 filter,最終得出的結論是:ServletContext -> listener -> filter -> servlet

        同時還存在著這樣一種配置節:context-param,它用于向 ServletContext 提供鍵值對,即應用程式背景關系資訊,我們的 listener, filter 等在初始化時會用到這些背景關系中的資訊,那么 context-param 配置節是不是應該寫在 listener 配置節前呢?實際上 context-param 配置節可寫在任意位置,因此真正的加載順序為:context-param -> listener -> filter -> servlet

        對于某類配置節而言,與它們出現的順序是有關的,以 filter 為例,web.xml 中當然可以定義多個 filter,與 filter 相關的一個配置節是 filter-mapping,這里一定要注意,對于擁有相同 filter-name 的 filter 和 filter-mapping 配置節而言,filter-mapping 必須出現在 filter 之后,否則當決議到 filter-mapping 時,它所對應的 filter-name 還未定義,web 容器啟動時初始化每個 filter 時,是按照 filter 配置節出現的順序來初始化的,當請求資源匹配多個 filter-mapping 時,filter 攔截資源是按照 filter-mapping 配置節出現的順序來依次呼叫 doFilter() 方法的,

        servlet 同 filter 類似,此處不再贅述,

       由此,可以看出,web.xml 的加載順序是:ServletContext -> context-param -> listener -> filter -> servlet ,而同個型別之間的實際程式呼叫的時候的順序是根據對應的 mapping 的順序進行呼叫的,

四 、 web.xml檔案詳解 

 

我將自己知道的web.xml的元素整理了一下:

1、web.xml首先是肯定要包含它的schema.

1 <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
4     version="2.4">
5 
6 </web-app>

其它的元素都放在<web-app></web-app>之中,

<discription></discription> 是對站臺的描述
<display-name></display-name> 定義站臺的名稱
<distributable/> 是指定該站臺是否可分布式處理
<context-param></context-param> 用來設定web站臺的環境引數,它包含兩個子元素:
    <param-name></param-name> 用來指定引數的名稱
    <param-value></param-value> 用來設定引數值

比如:

1 <context-param>
2     <param-name>my_param</param-name>
3     <param-value>hello</param-value>
4 </context-param>

在此設定的引數,可以在servlet中用 getServletContext().getInitParameter("my_param") 來取得

2、listener

<listener></listener> 用來設定Listener介面,它的主要子元素為
    <listener-class></listener-class> 定義Listener的類名稱

比如:

1 <listener>
2     <listener-class>com.myTest.ContextListener</listener-class> 
3 </listener>

3.1、filter
<filter></filter> 是用來宣告filter的相關設定,它包含以下子元素:
    <filter-name></filter-name> 這當然就是指定filter的名字
    <filter-class></filter-class> 這是用來定義filter的類的名稱
    <init-param></init-param> 用來定義引數,它有兩個子元素:
        <param-name></param-name> 用來指定引數的名稱
        <param-value></param-value> 用來設定引數值

比如:

1 <filter>
2         <filter-name>setCharacterEncoding</filter-name>
3         <filter-class>com.myTest.setCharacterEncodingFilter</filter-class>
4         <init-param>
5             <param-name>encoding</param-name>
6             <param-value>GB2312</param-value>
7         </init-param>
8 </filter>

3.2、filter-mapping

與<filter></filter>同時使用的是<filter-mapping></filter-mapping> 用來定義filter所對應的URL,它有兩個子元素:
    <filter-name></filter-name> 指定filter的名字
    <url-pattern></url-pattern> 指定filter所對應的URL

比如:

1 <filter-mapping>
2         <filter-name>setCharacterEncoding</filter-name>
3         <url-pattern>/*</url-pattern>
4 </filter-mapping>

4.1、servlet

<servlet></servlet> 用來宣告一個servlet的資料,主要有以下子元素:
    <servlet-name></servlet-name> 指定servlet的名稱
    <servlet-class></servlet-class> 指定servlet的類名稱
    <jsp-file></jsp-file> 指定web站臺中的某個JSP網頁的完整路徑
    <init-param></init-param> 用來定義引數,和前面的<init-param>差不多

4.2、servlet-mapping

與<servlet></servlet>一起使用的是<servlet-mapping></servlet-mapping> 用來定義servlet所對應的URL,包含兩個子元素:
    <servlet-name></servlet-name> 指定servlet的名稱
    <url-pattern></url-pattern> 指定servlet所對應的URL

比如:

1 <servlet>
2         <servlet-name>ShoppingServlet</servlet-name>
3         <servlet-class>com.myTest.ShoppingServlet</servlet-class>
4 </servlet>
5 <servlet-mapping>
6         <servlet-name>ShoppingServlet</servlet-name>
7         <url-pattern>/shop/ShoppingServlet</url-pattern>
8 </servlet-mapping>

5、session-config
<session-config></session-config> 用來定義web站臺中的session引數,包含一個子元素:
    <session-timeout></session-timeout> 用來定義這個web站臺所有session的有效期限,單位為 分鐘

6、mime-mapping
<mime-mapping></mime-mapping> 定義某一個擴展名和某一個MIME Type做對映,包含兩個子元素:
    <extension></extension> 擴展名的名稱
    <mime-type></mime-type> MIME格式

比如:

1 <mime-mapping>
2     <extension>doc</extension>
3     <mime-type>application/vnd.ms-word</mime-type>
4 </mime-mapping> 
5 <mime-mapping>
6     <extension>xls</extension>
7     <mime-type>application/vnd.ms-excel</mime-type>
8 </mime-mapping>

7、welcom-file-list
<welcome-file-list></welcom-file-list> 用來定義首頁的列單,包含一個子元素:
    <welcome-file></welcome-file> 指定首頁的檔案名稱

比如:

1 <welcome-file-list>
2     <welcome-file>index.jsp</welcome-file>
3     <welcome-file>index.html</welcome-file>
4 </welcom-file-list>

8、error-page
<error-page></error-page> 用來處理錯誤代碼或例外的頁面,有三個子元素:
    <error-code></error-code> 指定錯誤代碼
    <exception-type></exception-type> 指定一個JAVA例外型別
    <location></location> 指定在web站臺內的相關資源路徑

比如:

1 <error-page>
2     <error-code>404</error-code>
3     <location>/error404.jsp</location>
4 </error-page>
5 <error-page>
6     <exception-type>java.lang.Exception</exception-type>
7     <location>/exception.jsp</location>
8 </error-page>

9、taglib
<taglib></taglib> 用來設定JSP網頁所用到的Tag Library路徑,有兩個子元素:
    <taglib-uri></taglib-uri> 定義TLD檔案的URI,在JSP網頁中用taglib指令便可取得該URI的TLD檔案
    <taglib-location></taglib-location> 指定TLD檔案相對于web站臺的存放位置

比如:

1 <taglib>
2       <taglib-uri>myTaglib</taglib-uri>
3       <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
4 </taglib>

10、resource-ref
<resource-ref></resource-ref> 定義利用JNDI取得站臺可利用的資源,有五個子元素:
    <description></description> 資源說明
    <rec-ref-name></rec-ref-name> 資源名稱
    <res-type></res-type> 資源種類
    <res-auth></res-auth> 資源經由Application或Container來許可
    <res-sharing-scope></res-sharing-scope> 資源是否可以共享,有Shareable和Unshareable兩 個                                                                     值,默認為Shareable

比如,配置資料庫連接池就可在此配置:

1 <resource-ref>
2         <description>JNDI JDBC DataSource of shop</description>
3         <res-ref-name>jdbc/sample_db</res-ref-name>
4         <res-type>javax.sql.DataSource</res-type>
5         <res-auth>Container</res-auth>
6 </resource-ref>

11、jsp-config
<jsp-config> 包括<taglib> 和<jsp-property-group> 兩個子元素,
    其中<taglib>元素在JSP 1.2時就已經存在;而<jsp-property-group>是JSP 2.0 新增的元素,
    <jsp-property-group>元素主要有八個子元素,它們分別為:
    1).<description>:設定的說明;
    2).<display-name>:設定名稱;
    3).<url-pattern>:設定值所影響的范圍,如:/CH2 或 /*.jsp;
    4).<el-ignored>:若為true,表示不支持EL 語法;
    5).<scripting-invalid>:若為true,表示不支持<% scripting %>語法;
    6).<page-encoding>:設定JSP 網頁的編碼;
    7).<include-prelude>:設定JSP 網頁的抬頭,擴展名為.jspf;
    8).<include-coda>:設定JSP 網頁的結尾,擴展名為.jspf,
一個簡單的<jsp-config>元素完整配置:

 1 <jsp-config>
 2     <taglib>
 3         <taglib-uri>Taglib</taglib-uri>
 4         <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
 5     </taglib>
 6     <jsp-property-group>
 7         <description>Special property group for JSP Configuration JSP example.</description>
 8         <display-name>JSPConfiguration</display-name>
 9         <url-pattern>/jsp/* </url-pattern>
10         <el-ignored>true</el-ignored>
11         <page-encoding>GB2312</page-encoding>
12         <scripting-invalid>true</scripting-invalid>
13         <include-prelude>/include/prelude.jspf</include-prelude>
14         <include-coda>/include/coda.jspf</include-coda>
15     </jsp-property-group>
16 </jsp-config>  


配置web.xml來限制對某些servlet的請求

有時我們只希望通過認證的用戶才能請求某些servlet的話,就可以在web.xml中來進行相應的配置,來達到此目的,

這就要用到<security-constraint></security-constraint>元素,
對于tomcat,中web.xml使用security-constraint元素需要在位于<Tomcat-installation- directory>/conf/tomcat-users.xml的XML檔案中創建用戶名和密碼,比如下面的這個tomcat- users.xml檔案:

1 <?xml version='1.0' encoding='utf-8'?>
2 <tomcat-users>
3   <role rolename="tomcat"/>
4   <role rolename="manager"/>
5   <role rolename="admin"/>
6   <user username="tomcat" password="tomcat" roles="tomcat"/>
7   <user username="both" password="tomcat" roles="tomcat,manager"/>
8   <user username="admin" password="admin" roles="admin"/>
9 </tomcat-users>

此XML片段包括一個tomcat-users根元素,它包含一個或多個role和user元素,
然后在Web應用程式的web.xml中創建security-constraint、login-config和security-role元素,

 1 <security-constraint>
 2       <web-resource-collection>
 3           <web-resource-name>HelloServlet</web-resource-name>
 4           <url-pattern>/HelloServlet</url-pattern>
 5           <http-method>GET</http-method>
 6           <http-method>POST</http-method>
 7       </web-resource-collection>
 8       <auth-constraint>
 9           <description>This applies only to the "tomcat" security role</description>
10           <role-name>admin</role-name>
11       </auth-constraint>
12       <user-data-constraint>
13           <transport-guarantee>NONE</transport-guarantee>
14       </user-data-constraint>
15   </security-constraint>
16   <login-config>
17       <auth-method>BASIC</auth-method>
18   </login-config>
19   <security-role>
20       <role-name>admin</role-name>
21   </security-role>

其中security-constraint元素包含一個或多個web-resource-collection元素,它是描述Web應用程式中的哪些 web資源受到指定安全限制的保護,http-method元素指定安全限制覆寫的HTTP方法,上面的例子中,當我們對/HelloServlet的 GET或POST請求時將觸發配置的安全機制,
auth-constraint元素用于描述允許訪問Web組件的安全角色,此例中安全角色的例子有tomcat、manager、admin,而只有當作為admin角色的用戶才可以訪問HelloServlet,

Web應用程式通過login-config元素來認證用戶,并確認該用戶是否為正確的角色,
longin-config包含的transport-guarantee子元素用來指定認證方法,BASIC是一種常見的Web認證方式,瀏覽器給用戶 提示一個對話框,要求輸入用戶名和密碼,隨后Tomcat將給出的用戶名和密碼與tomcat-users.xml中的用戶名和密碼進行比較,然后使用前 面的security-constraint配置來確定用戶是否可訪問受保護的servlet,

(除BASIC外,還可以是FORM、CLIENT-CERT、DIGEST等)

其實這種認證方法實際上有兩個步驟:
1、檢查提供的用戶名和密碼是否正確,
2、判斷用戶是否映射到特定的安全角色,例如,用戶可能提供了正確的用戶名和密碼,但沒有映射到特定的安全角色,也將被禁止訪問特定的Web資源,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/12545.html

標籤:架構設計

上一篇:微服務優化之使用gRPC做微服務的內部通信

下一篇:如何建立架構師的立體化思維?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more