Web.xml詳解(轉)

這篇文章主要是綜合網上關於web.xml的一些介紹,但願對你們有所幫助,也歡迎你們一塊兒討論。 ---題記html

1、            Web.xml詳解:

(一)  web.xml加載過程(步驟)

首先簡單說一下,web.xml的加載過程。
當咱們去啓動一個WEB項目時,容器包括(JBossTomcat等)首先會讀取項目web.xml配置文件裏的配置,當這一步驟沒有出錯而且完成以後,項目才能正常地被啓動起來。
l  啓動WEB項目的時候,容器首先會去它的配置文件web.xml讀取兩個節點
<listener></listener><context-param></context-param>
l  緊接着,容器建立一個ServletContextapplication),這個WEB項目全部部分都將共享這個上下文。
l  容器以<context-param></context-param>name做爲鍵,value做爲值,將其轉化爲鍵值對,存入ServletContext
l  容器建立<listener></listener>中的類實例,根據配置的class類路徑<listener-class>來建立監聽,在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,啓動Web應用時,系統調用Listener的該方法,在這個方法中得到:
ServletContext application =ServletContextEvent.getServletContext();
context-param的值= application.getInitParameter("context-param的鍵");
獲得這個context-param的值以後,你就能夠作一些操做了。
l   舉例:你可能想在項目啓動以前就打開數據庫,那麼這裏就能夠在<context-param>中設置數據庫的鏈接方式(驅動、urluserpassword),在監聽類中初始化數據庫的鏈接。這個監聽是本身寫的一個類,除了初始化方法,它還有銷燬方法,用於關閉應用前釋放資源。好比:說數據庫鏈接的關閉,此時,調用contextDestroyed(ServletContextEvent args),關閉Web應用時,系統調用Listener的該方法。
l  接着,容器會讀取<filter></filter>,根據指定的類路徑來實例化過濾器。
l  以上都是在WEB項目尚未徹底啓動起來的時候就已經完成了的工做。若是系統中有Servlet,則Servlet是在第一次發起請求的時候被實例化的,並且通常不會被容器銷燬,它能夠服務於多個用戶的請求。因此,Servlet的初始化都要比上面提到的那幾個要遲。
總的來講,web.xml的加載順序是: <context-param>-> <listener> -> <filter> -> <servlet>其中,若是web.xml中出現了相同的元素,則按照在配置文件中出現的前後順序來加載。
對於某類元素而言,與它們出現的順序是有關的。以<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標籤詳解

1.      XML文檔有效性檢查

<!DOCTYPE web-app PUBLICjava

 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"mysql

 "http://Java.sun.com/dtd/web-app_2_3.dtd" >web

這段代碼指定文件類型定義(DTD),能夠經過它檢查XML文檔的有效性。下面顯示的<!DOCTYPE>元素有幾個特性,這些特性告訴咱們關於DTD的信息: spring

  • web-app定義該文檔(部署描述符,不是DTD文件)的根元素 
  • PUBLIC意味着DTD文件能夠被公開使用 
  • "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"意味着DTDSun Microsystems, Inc.維護。該信息也表示它描述的文檔類型是DTD Web Application 2.3,並且DTD是用英文書寫的。 
  • URL"http://java.sun.com/dtd/web-app_2_3.dtd"表示D文件的位置。

2.      <web-app></web-app>

部署描述符的根元素是<web-app>DTD文件規定<web-app>元素的子元素的語法以下: sql

<!ELEMENT web-app (icon?, display-name?, description?, 
distributable?, context-param*, filter*, filter-mapping*, 
listener*, servlet*, servlet-mapping*, session-config?, 
mime-mapping*, welcome-file-list?, 
error-page*, taglib*, resource-env-ref*, resource-ref*, 
security-constraint*, login-config?, security-role*,env-entry*, 
ejb-ref*, ejb-local-ref*)> 
    正如您所看到的,這個元素含有23個子元素,並且子元素都是可選的。問號()表示子元素是可選的,並且只能出現一次。星號(*)表示子元素可在部署描述符中出現零次或屢次。有些子元素還能夠有它們本身的子元素。web.xml文件中<web-app>元素聲明的是下面每一個子元素的聲明。下面講述部署描述符中可能包含的全部子元素。數據庫

注意:小程序

Servlet 2.3中,子元素必須按照DTD文件語法描述中指定的順序出現。好比:若是部署描述符中的<web-app>元素有<servlet><servlet-mapping>兩個子元素,則<servlet>子元素必須出如今<servlet-mapping>子元素以前。在Servlet2.4中,順序並不重要。瀏覽器

3.      <display-name></display-name>

<display-name>test-hwp-web-application</display-name>定義了web應用的名稱,能夠在http://localhost:8080/manager/html中顯示。以下所示:緩存


4.      <distributable/>

<distributable/>可使distributable元素來告訴servlet/JSP容器,Web容器中部署的應用程序適合在分佈式環境下運行。

5.      <context-param></context-param>

 

<!--****************************上下文初始化參數配***************************-->
<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>business.root</param-value>
</context-param>
<!-- spring config -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-configuration/*.xml</param-value>
</context-param>

 

 

<context-param>元素含有一對參數名和參數值,用做應用的Servlet上下文初始化參數,參數名在整個Web應用中必須是唯一的,web應用的整個生命週期中上下文初始化參數都存在,任意的Servletjsp均可以隨時隨地訪問它。<param-name>子元素包含有參數名,而<param-value>子元素包含的是參數值。做爲選擇,可用<description>子元素來描述參數。

  • 什麼狀況下使用,爲何使用<context-param>

好比:定義一個管理員email地址用來從程序發送錯誤,或者與你整個應用程序有關的其餘設置。使用本身定義的設置文件須要額外的代碼和管理;直接在你的程序中使用硬編碼(Hard-coding)參數值會給你以後修改程序帶來麻煩,更困難的是,要根據不一樣的部署使用不一樣的設置;經過這種辦法,可讓其餘開發人員更容易找到相關的參數,由於它是一個用於設置這種參數的標準位置。

  • Spring配置文件:

配置spring必須須要<listener>,而<context-param>無關緊要,若是在web.xml中不寫<context-param>配置信息,默認的路徑是/WEB-INF/applicationContext.xml,在WEB-INF目錄下建立的xml文件的名稱必須是applicationContext.xml。若是是要自定義文件名能夠在web.xml里加入contextConfigLocation這個context參數:在<param-value>裏指定相應的xml文件名,若是有多個xml文件,能夠寫在一塊兒並以「,」號分隔,好比在business-client工程中,咱們採用了自定義配置方式,<context-param>配置以下:

1 <!-- spring config -->
2 <context-param>
3     <param-name>contextConfigLocation</param-name>
4     <param-value>/WEB-INF/spring-configuration/*.xml</param-value>
5 </context-param>
6 <listener>
7      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
8  </listener>

 

對應工程目錄結構以下所示:


  • webAppRootKey配置:

部署在同一容器中的多個Web項目,要配置不一樣的webAppRootKeyweb.xml文件中最好定義webAppRootKey參數,若是不定義,將會缺省爲「webapp.root」,以下:

1 <!-- 應用路徑  -->  
2  <context-param>  
3         <param-name>webAppRootKey</param-name>  
4         <param-value>webapp.root</param-value>  
5  </context-param> 

 

固然也不能重複,不然報相似下面的錯誤:

Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!  

意思是「webapp.root」這個key已經指向了項目1,不能夠再指向項目2。多個項目要對webAppRootKey進行配置,咱們工程主要是讓log4j能將日誌寫到對應項目根目錄下,好比:咱們的項目的webAppRootKey

 

 1 <!—business-client應用路徑  -->  
 2     <context-param>  
 3         <param-name>webAppRootKey</param-name>  
 4         <param-value> business.root </param-value>  
 5     </context-param>  
 6 <!—public-base應用路徑  -->  
 7     <context-param>  
 8         <param-name>webAppRootKey</param-name>  
 9         <param-value> pubbase.root</param-value>  
10     </context-param>  

 

這樣就不會出現衝突了。就能夠在運行時動態地找到項目路徑,在log4j.properties配置文件中能夠按下面的方式使用${webapp.root}

 

log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log 

就能夠在運行時動態地找出項目的路徑。

  • 多個配置文件交叉引用處理:

若是web.xml中有contextConfigLocation參數指定的Spring配置文件則會去加載相應的配置文件,而不會去加載/WEB-INF/下的applicationContext.xml。可是若是沒有指定的話,默認會去/WEB-INF/下加載applicationContext.xml

在一個團隊使用Spring的實際項目中,應該須要多個Spring的配置文件,如何使用和交叉引用的問題:

多個配置文件能夠在web.xml裏用空格分隔寫入,如:

 

1 <context-param>
2 <param-name>contextConfigLocation </param-name>
3 <param-value> applicationContext-database.xml,applicationContext.xml</param-value>  
4 <context-param>

 

 

多個配置文件裏的交叉引用能夠用refexternalbean解決,例如:

applicationContext.xml

1 <bean id="userService" class="domain.user.service.impl.UserServiceImpl"> 
2 <property name="dbbean">
3 <ref bean="dbBean"/>
4 </property> 
5 </bean>

 

dbBeanapplicationContext-database.xml

  • 在不一樣環境下如何獲取:
範例:

 

1 <context-param>
2 <param-name>param_name</param-name>
3 <param-value>param_value</param-value>
4 </context-param>

 

此所設定的參數,在JSP網頁中可使用下列方法來取得:
${initParam.param_name}
若在Servlet可使用下列方法來得到:
String param_name=getServletContext().getInitParamter("param_name");
ServletServletConfig對象擁有該ServletServletContext的一個引用,因此可這樣取得上下文初始化參數:getServletConfig().getServletContext().getInitParameter()也能夠在Servlet中直接調用getServletContext().getInitParameter(),二者是等價的。

6.       <session-config></session-config>

 

1 <!-- Set timeout to 120 minutes -->
2 <session-config> 
3 <session-timeout>120</session-timeout> 
4 </session-config> 

 

<session-config用於設置容器的session參數,好比:<session-timeout>用於指定http session的失效時間。默認時間設置在<jakarta>/conf/web.xml (30 minutes)<session-timeout>用來指定默認的會話超時時間間隔,以分鐘爲單位。該元素值必須爲整數。若是 session-timeout元素的值爲零或負數,則表示會話將永遠不會超時。

7.      <listener></listener>

 

 1 <!--****************************監聽器配置*********************************-->
 2 <!-- Spring的log4j監聽器 -->
 3 <listener>
 4     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 5 </listener>
 6 <listener>
 7     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 8 </listener>
 9 <!-- 與CAS Single Sign Out Filter配合,註銷登陸信息  --> 
10 <listener>
11 <listener-class>com.yonyou.mcloud.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
12 </listener>

 

1.         Listener介紹:

<listener>web應用程序定義監聽器,監聽器用來監聽各類事件,好比:applicationsession事件,全部的監聽器按照相同的方式定義,功能取決去它們各自實現的接口,經常使用的Web事件接口有以下幾個:

  • ServletContextListener:用於監聽Web應用的啓動和關閉;
  • ServletContextAttributeListener:用於監聽ServletContext範圍(application)內屬性的改變;
  • ServletRequestListener:用於監聽用戶的請求;
  • ServletRequestAttributeListener:用於監聽ServletRequest範圍(request)內屬性的改變;
  • HttpSessionListener:用於監聽用戶session的開始和結束;
  • HttpSessionAttributeListener:用於監聽HttpSession範圍(session)內屬性的改變。

<listener>主要用於監聽Web應用事件,其中有兩個比較重要的WEB應用事件:應用的啓動和中止(starting up or shutting downSession的建立和失效(created or destroyed應用啓動事件發生在應用第一次被Servlet容器裝載和啓動的時候;中止事件發生在Web應用中止的時候。Session建立事件發生在每次一個新的session建立的時候,相似地Session失效事件發生在每次一個Session失效的時候。爲了使用這些Web應用事件作些有用的事情,咱們必須建立和使用一些特殊的「監聽類」。它們是實現瞭如下兩個接口中任何一個接口的簡單java類:javax.servlet.ServletContextListenerjavax.servlet.http.HttpSessionListener,若是想讓你的類監聽應用的啓動和中止事件,你就得實現ServletContextListener接口;想讓你的類去監聽Session的建立和失效事件,那你就得實現HttpSessionListener接口。

2.     Listener配置:
配置Listener只要向Web應用註冊Listener實現類便可,無序配置參數之類的東西,由於Listener獲取的是Web應用ServletContextapplication)的配置參數。爲Web應用配置Listener的兩種方式:
l  使用@WebListener修飾Listener實現類便可。
l  web.xml文檔中使用<listener>進行配置。
咱們選擇web.xml這種配置方式,只有一個元素<listener-class>指定Listener的實現類,以下所示:

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

這裏的<listener>用於Spring加載,Spring加載能夠利用ServletContextListener實現,也能夠採用load-on-startup Servlet 實現,可是當<filter>須要用到bean時,但加載順序是:先加載<filter>後加載<servlet>,則<filter>中初始化操做中的beannull;因此,若是過濾器中要使用到bean,此時就能夠根據加載順序<listener> -> <filter> -> <servlet>,將spring的加載改爲Listener的方式。

1)     利用ServletContextListener實現:

 

1 <servlet>    
2          <servlet-name>context</servlet-narne>   
3 <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>    
4 <load-on-startup>1</load-on-startup>    
5 </servlet> 

 

2)     採用load-on-startup Servlet 實現:
1 <listener>
2 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
3 </listener> 

 

咱們選擇了第二種方式,在J2EE工程中web服務器啓動的時候最早調用web.xml,上面這段配置的意思是加載spring的監聽器,其中ContextLoaderListener的做用就是啓動Web容器時,自動裝配applicationContext.xml的配置信息,執行它所實現的方法

8.      <filter></filter>

  1 <!--****************************過濾器配置*********************************-->
  2   <!-- 字符集過濾器 -->
  3   <filter>
  4     <filter-name>CharacterEncodingFilter</filter-name>
  5     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  6     <init-param>
  7       <param-name>encoding</param-name>
  8       <param-value>UTF-8</param-value>
  9     </init-param>
 10     <init-param>
 11       <param-name>forceEncoding</param-name>
 12       <param-value>true</param-value>
 13     </init-param>
 14   </filter>
 15   <!-- 單點登出過濾器 -->
 16   <filter>
 17     <filter-name>CAS Single Sign Out Filter</filter-name>
 18     <filter-class>com.yonyou.mcloud.cas.client.session.SingleSignOutFilter</filter-class>
 19   </filter>
 20   <!-- 認證過濾器 -->
 21   <filter>
 22     <filter-name>CAS Authentication Filter</filter-name>
 23 <filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class>
 24     <init-param>
 25       <param-name>casServerLoginUrl</param-name>
 26       <param-value>https://dev.yonyou.com:443/sso-server/login</param-value>
 27     </init-param>
 28     <init-param>
 29       <!--這裏的server是服務端的IP -->
 30       <param-name>serverName</param-name>
 31       <param-value>http://10.1.215.40:80</param-value>
 32     </init-param>
 33   </filter>
 34   <!-- 驗證ST/PT過濾器 -->
 35   <filter>
 36     <filter-name>CAS Validation Filter</filter-name>
 37 <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
 38     <init-param>
 39       <param-name>casServerUrlPrefix</param-name>
 40       <param-value>https://dev.yonyou.com:443/sso-server</param-value>
 41     </init-param>
 42     <init-param>
 43       <param-name>serverName</param-name>
 44       <param-value>http://10.1.215.40:80</param-value>
 45     </init-param>
 46     <init-param>
 47       <param-name>proxyCallbackUrl</param-name>
 48       <param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value>
 49     </init-param>
 50     <init-param>
 51       <param-name>proxyReceptorUrl</param-name>
 52       <param-value>/proxyCallback</param-value>
 53     </init-param>
 54     <init-param>
 55       <param-name>proxyGrantingTicketStorageClass</param-name>
 56 <param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value>
 57     </init-param>
 58     <!-- 解決中文問題 -->
 59     <init-param>
 60       <param-name>encoding</param-name>
 61       <param-value>UTF-8</param-value>
 62     </init-param>
 63   </filter>
 64   <filter>
 65     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
 66     <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
 67   </filter>
 68   <filter>
 69     <filter-name>CAS Assertion Thread Local Filter</filter-name>
 70     <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
 71   </filter>
 72   <filter>
 73     <filter-name>NoCache Filter</filter-name>
 74     <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
 75   </filter>
 76   <!--****************************映射關係配置********************************-->
 77   <filter-mapping>
 78     <filter-name>CharacterEncodingFilter</filter-name>
 79     <url-pattern>/*</url-pattern>
 80   </filter-mapping>
 81   <filter-mapping>
 82     <filter-name>NoCache Filter</filter-name>
 83     <url-pattern>/*</url-pattern>
 84   </filter-mapping>
 85   <filter-mapping>
 86     <filter-name>CAS Single Sign Out Filter</filter-name>
 87     <url-pattern>/*</url-pattern>
 88   </filter-mapping>
 89   <filter-mapping>
 90     <filter-name>CAS Validation Filter</filter-name>
 91     <url-pattern>/proxyCallback</url-pattern>
 92   </filter-mapping>
 93   <filter-mapping>
 94     <filter-name>CAS Authentication Filter</filter-name>
 95     <url-pattern>/*</url-pattern>
 96   </filter-mapping>
 97   <filter-mapping>
 98     <filter-name>CAS Validation Filter</filter-name>
 99     <url-pattern>/*</url-pattern>
100   </filter-mapping>
101   <filter-mapping>
102     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
103     <url-pattern>/*</url-pattern>
104   </filter-mapping>
105   <filter-mapping>
106     <filter-name>CAS Assertion Thread Local Filter</filter-name>
107     <url-pattern>/*</url-pattern>
108   </filter-mapping>

 

1.      Filter介紹:
Filter可認爲是Servle的一種「增強版」,主要用於對用戶請求request進行預處理,也能夠對Response進行後處理,是個典型的處理鏈。使用Filter的完整流程是:Filter對用戶請求進行預處理,接着將請求HttpServletRequest交給Servlet進行處理並生成響應,最後Filter再對服務器響應HttpServletResponse進行後處理。FilterServlet具備徹底相同的生命週期,且Filter也能夠經過<init-param>來配置初始化參數,獲取Filter的初始化參數則使用FilterConfiggetInitParameter()

換種說法,Servlet裏有requestresponse兩個對象,Filter可以在一個request到達Servlet以前預處理request,也能夠在離開Servlet時處理responseFilter實際上是一個Servlet鏈。如下是Filter的一些常見應用場合,

(1)認證Filter

(2)日誌和審覈Filter

(3)圖片轉換Filter

(4)數據壓縮Filter

(5)密碼Filter

(6)令牌Filter

(7)觸發資源訪問事件的Filter

(8)XSLT Filter

(9)媒體類型鏈Filter

Filter可負責攔截多個請求或響應;一個請求或響應也可被多個Filter攔截。建立一個Filter只需兩步:

  • 建立Filter處理類
  • Web.xml文件中配置Filter

Filter必須實現javax.servlet.Filter接口,在該接口中定義了三個方法:

  • void init(FilterConfig config):用於完成Filter的初始化。FilteConfig用於訪問Filter的配置信息。
  • void destroy():用於Filter銷燬前,完成某些資源的回收。
  • void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實現過濾功能的核心方法,該方法就是對每一個請求及響應增長額外的處理。該方法實現對用戶請求request進行預處理,也能夠實現對服務器響應response進行後處理---它們的分界線爲是否調用了chain.doFilter(requestresponse),執行該方法以前,即對用戶請求request進行預處理,執行該方法以後,即對服務器響應response進行後處理。
2.      Filter配置:
Filter可認爲是Servlet的「加強版」,所以Filter配置與Servlet的配置很是類似,須要配置兩部分:配置Filter名稱和Filter攔截器URL模式。區別在於Servlet一般只配置一個URL,而Filter能夠同時配置多個請求的URL。配置Filter有兩種方式:
l  Filter類中經過Annotation進行配置。
l  web.xml文件中經過配置文件進行配置。
咱們使用的是web.xml這種配置方式,下面重點介紹<filter>內包含的一些元素。
<filter>用於指定Web容器中的過濾器,可包含<filter-name><filter-class><init-param><icon><display-name><description>
l  <filter-name>用來定義過濾器的名稱,該名稱在整個程序中都必須惟一。
l  <filter-class>元素指定過濾器類的徹底限定的名稱,即Filter的實現類。
l  <init-param>Filter配置參數,與<context-param>具備相同的元素描述符<param-name><param-value>
l  <filter-mapping>元素用來聲明Web應用中的過濾器映射,過濾器被映射到一個servlet或一個URL 模式。這個過濾器的<filter><filter-mapping>必須具備相同的<filter-name>,指定該Filter所攔截的URL。過濾是按照部署描述符的<filter-mapping>出現的順序執行的。
1)  字符集過濾器
 
 1 <!-- 字符集過濾器 -->
 2   <filter>
 3     <filter-name>CharacterEncodingFilter</filter-name>
 4     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 5     <init-param>
 6       <param-name>encoding</param-name>
 7       <param-value>UTF-8</param-value>
 8     </init-param>
 9     <init-param>
10       <param-name>forceEncoding</param-name>
11       <param-value>true</param-value>
12     </init-param>
13   </filter>
14 <filter-mapping>
15     <filter-name>CharacterEncodingFilter</filter-name>
16     <url-pattern>/*</url-pattern>
17   </filter-mapping>

 

CharacterEncodingFilter類能夠經過簡單配置來幫咱們實現字符集轉換的功能,參數encoding用於指定編碼類型,參數forceEncoding設爲true時,強制執行request.setCharacterEncoding(this.encoding)reponse.setCharacterEncoding(this.encoding)中的方法。
2)  緩存控制
 
1 <filter>
2     <filter-name>NoCache Filter</filter-name>
3     <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
4 </filter>
5   <filter-mapping>
6 <filter-name>NoCache Filter</filter-name>
7 <!—表示對URL所有過濾-->
8     <url-pattern>/*</url-pattern>
9 </filter-mapping>

 

3)  登陸認證
<!-- 認證過濾器 -->
 1 <filter>
 2     <filter-name>CAS Authentication Filter</filter-name>
 3 <filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class>
 4 <init-param>
 5       <param-name>casServerLoginUrl</param-name>
 6       <param-value>https://dev.yonyou.com:443/sso-server/login</param-value>
 7     </init-param>
 8     <init-param>
 9       <!--這裏的server是服務端的IP -->
10       <param-name>serverName</param-name>
11       <param-value>http://10.1.215.40:80</param-value>
12     </init-param>
13   </filter>
14   <filter-mapping>
15      <filter-name>CAS Authentication Filter</filter-name>
16      <url-pattern>/*</url-pattern>
17   </filter-mapping>

 

登陸認證,未登陸用戶導向CAS Server進行認證。
4)  單點登出
 
 1 <filter>
 2            <filter-name>CAS Single Sign Out Filter</filter-name>
 3            <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
 4 </filter>
 5 <filter-mapping>
 6            <filter-name>CAS Single Sign Out Filter</filter-name>
 7            <url-pattern>/*</url-pattern>
 8 
 9 </filter-mapping>
10 <listener>
11 <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
12 </listener>

 

CAS Server通知CAS Client,刪除session,註銷登陸信息。
5)  封裝request
1 <filter>
2     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
3     <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
4 </filter>
5 <filter-mapping>
6     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
7     <url-pattern>/*</url-pattern>
8 </filter-mapping>

 

封裝request, 支持getUserPrincipal等方法。
6)  存放AssertionThreadLocal 
1 <filter>
2     <filter-name>CAS Assertion Thread Local Filter</filter-name>
3     <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
4 </filter>
5 <filter-mapping>
6     <filter-name>CAS Assertion Thread Local Filter</filter-name>
7     <url-pattern>/*</url-pattern>
8 </filter-mapping>

 


7)  禁用瀏覽器緩存
1 <filter>
2     <filter-name>NoCache Filter</filter-name>
3     <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
4  </filter>
5  <filter-mapping>
6     <filter-name>NoCache Filter</filter-name>
7     <url-pattern>/*</url-pattern>
8  </filter-mapping>

 

8)  CAS ClientCAS Server進行ticket驗證
 
 1 <!-- 驗證ST/PT過濾器 -->
 2 <filter>
 3    <filter-name>CAS Validation Filter</filter-name>
 4     <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
 5    <init-param>
 6       <param-name>casServerUrlPrefix</param-name>
 7       <param-value>https://dev.yonyou.com:443/sso-server</param-value>
 8    </init-param>
 9    <init-param>
10       <param-name>serverName</param-name>
11       <param-value>http://10.1.215.40:80</param-value>
12    </init-param>
13    <init-param>
14       <param-name>proxyCallbackUrl</param-name>
15       <param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value>
16    </init-param>
17    <init-param>
18       <param-name>proxyReceptorUrl</param-name>
19       <param-value>/proxyCallback</param-value>
20    </init-param>
21    <init-param>
22       <param-name>proxyGrantingTicketStorageClass</param-name>
23 <param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value>
24    </init-param>
25    <!-- 解決中文問題 -->
26    <init-param>
27       <param-name>encoding</param-name>
28       <param-value>UTF-8</param-value>
29    </init-param>
30 </filter>
31 <filter-mapping>
32     <filter-name>CAS Validation Filter</filter-name>
33     <url-pattern>/proxyCallback</url-pattern>
34 </filter-mapping>
35 <filter-mapping>
36     <filter-name>CAS Validation Filter</filter-name>
37     <url-pattern>/*</url-pattern>
38 </filter-mapping>

 

9.      <servlet></servlet>

 1 <!--****************************servlet配置******************************-->
 2 <!-- Spring view分發器  對全部的請求都由business對應的類來控制轉發 -->
 3 <servlet>
 4     <servlet-name>business</servlet-name>
 5     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 6     <init-param>
 7       <param-name>publishContext</param-name>
 8       <param-value>false</param-value>
 9     </init-param>
10     <load-on-startup>1</load-on-startup>
11 </servlet>
12 <!-- 用戶登出 -->
13 <servlet>
14     <servlet-name>LogOutServlet</servlet-name>
15     <servlet-class>com.yonyou.mcloud.cas.web.servlet.LogOutServlet</servlet-class>
16     <init-param>
17       <param-name>serverLogoutUrl</param-name>
18       <param-value>https://dev.yonyou.com:443/sso-server/logout</param-value>
19     </init-param>
20     <init-param>
21       <param-name>serverName</param-name>
22       <param-value>http://10.1.215.40:80/business/</param-value>
23     </init-param>
24 </servlet>
25 <!--****************************servlet映射關係配置*************************-->
26 <servlet-mapping>
27     <servlet-name>LogOutServlet</servlet-name>
28     <url-pattern>/logout</url-pattern>
29 </servlet-mapping>
30 <servlet-mapping>
31     <servlet-name>business</servlet-name>
32     <url-pattern>/</url-pattern>
33 </servlet-mapping>

 


  1. Servlet介紹

Servlet一般稱爲服務器端小程序,是運行在服務器端的程序,用於處理及響應客戶的請求。Servlet是個特殊的java類,繼承於HttpServlet。客戶端一般只有GETPOST兩種請求方式,Servlet爲了響應則兩種請求,必須重寫doGet()doPost()方法。大部分時候,Servlet對於全部的請求響應都是徹底同樣的,此時只須要重寫service()方法便可響應客戶端的全部請求

另外HttpServlet有兩個方法

  • init(ServletConfig config):建立Servlet實例時,調用該方法的初始化Servlet資源
  • destroy():銷燬Servlet實例時,自動調用該方法的回收資源。

一般無需重寫init()destroy()兩個方法,除非須要在初始化Servlet時,完成某些資源初始化的方法,才考慮重寫init()方法,若是重寫了init()方法,應在重寫該方法的第一行調用super.init(config),該方法將調用HttpServletinit()方法。若是須要在銷燬Servlet以前,先完成某些資源的回收,好比關閉數據庫鏈接,才須要重寫destory方法()

Servlet的生命週期:

建立Servlet實例有兩個時機:

  • 客戶端第一次請求某個Servlet時,系統建立該Servlet的實例,大部分Servlet都是這種Servlet
  • Web應用啓動時當即建立Servlet實例,即load-on-start Servlet

每一個Servlet的運行都遵循以下生命週期:

  1. 建立Servlet實例
  2. Web容器調用Servletinit()方法,對Servlet進行初始化。
  3. Servlet初始化後,將一直存在於容器中,用於響應客戶端請求,若是客戶端發送GET請求,容器調用ServletdoGet()方法處理並響應請求;若是客戶端發送POST請求,容器調用ServletdoPost()方法處理並響應請求。或者統一使用service()方法處理來響應用戶請求。
  4. Web容器決定銷燬Servlet時,先調用Servletdestory()方法,一般在關閉Web應用時銷燬Servlet實例
  1. Servlet配置:

爲了讓Servlet能響應用戶請求,還必須將Servlet配置在web應用中,配置Servlet須要修改web.xml文件

Servlet3.0開始,配置Servlet有兩種方式:

  • Servlet類中使用@WebServlet Annotation進行配置。
  • web.xml文件中進行配置。

咱們用web.xml文件來配置Servlet,須要配置<servlet><servlet-mapping>

<servlet>用來聲明一個Servlet<icon><display-name><description>元素的用法和<filter>的用法相同。<init-param>元素與<context-param>元素具備相同的元素描述符,可使用<init-param>子元素將初始化參數名和參數值傳遞給Servlet,訪問Servlet配置參數經過ServletConfig對象來完成,ServletConfig提供以下方法:

java.lang.String.getInitParameter(java.lang.String name):用於獲取初始化參數

ServletConfig獲取配置參數的方法和ServletContext獲取配置參數的方法徹底同樣,只是ServletConfig是取得當前Servlet的配置參數,而ServletContext是獲取整個Web應用的配置參數。

  1. <description><display-name><icon>
  • <description>:爲Servlet指定一個文本描述。
  • <display-name>:爲Servlet提供一個簡短的名字被某些工具顯示。
  • <icon>:爲Servlet指定一個圖標,在圖形管理工具中表示該Servlet
  1. <servlet-name><servlet-class><jsp-file>元素

<servlet>必須含有<servlet-name><servlet-class>,或者<servlet-name><jsp-file> 描述以下:

  • <servlet-name>用來定義servlet的名稱,該名稱在整個應用中必須是唯一的
  • <servlet-class>用來指定servlet的徹底限定的名稱。
  • <jsp-file>用來指定應用中JSP文件的完整路徑。這個完整路徑必須由/開始。
  1. <load-on-startup>

若是load-on-startup元素存在,並且也指定了jsp-file元素,則JSP文件會被從新編譯成Servlet,同時產生的Servlet也被載入內存。<load-on-startup>的內容能夠爲空,或者是一個整數。這個值表示由Web容器載入內存的順序。

舉個例子:若是有兩個Servlet元素都含有<load-on-startup>子元素,則<load-on-startup>子元素值較小的Servlet將先被加載。若是<load-on-startup>子元素值爲空或負值,則由Web容器決定何時加載Servlet。若是兩個Servlet<load-on-startup>子元素值相同,則由Web容器決定先加載哪個Servlet

<load-on-startup>1</load-on-startup>表示啓動容器時,初始化Servlet

  1. <servlet-mapping>

<servlet-mapping>含有<servlet-name><url-pattern>

  • <servlet-name>Servlet的名字,惟一性和一致性,與<servlet>元素中聲明的名字一致。
  • <url-pattern>:指定相對於ServletURL的路徑。該路徑相對於web應用程序上下文的根路徑。<servlet-mapping>URL模式映射到某個Servlet,即該Servlet處理的URL
  1. 加載Servlet的過程 

容器的Context對象對請求路徑(URL)作出處理,去掉請求URL的上下文路徑後,按路徑映射規則和Servlet映射路徑(<url- pattern>)作匹配,若是匹配成功,則調用這個Servlet處理請求。

  1. DispatcherServletweb.xml中的配置:

 1 <!-- Spring view分發器  對全部的請求都由business對應的類來控制轉發 -->
 2 <servlet>
 3     <servlet-name>business</servlet-name>
 4     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 5     <init-param>
 6       <param-name>publishContext</param-name>
 7       <param-value>false</param-value>
 8     </init-param>
 9     <load-on-startup>1</load-on-startup>
10 </servlet>

 

配置Spring MVC,指定處理請求的Servlet,有兩種方式:
l  默認查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml
l  能夠經過配置修改MVC配置文件的位置,須要在配置DispatcherServlet時指定MVC配置文件的位置。
    咱們在平臺項目兩個工程中分別使用了不一樣的配置方式,介紹以下:
咱們在business-client工程中按照默認方式查找MVC的配置文件,配置文件目錄爲: /WEB-INF/business-servlet.xml。工程目錄結構以下所示:

咱們在public-base-server工程中,經過第2種方式進行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,則須要在配置DispatcherServlet時指定<init-param>標籤。具體代碼以下:
 
<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
              <param-name>publishContext</param-name>
              <param-value>false</param-value>
</init-param>
 <init-param>  
                     <param-name>contextConfigLocation</param-name>  
                    <param-value>classpath:config/spring-servlet.xml</param-value>  
           </init-param> 
     <load-on-startup>1</load-on-startup>
</servlet>

 

工程目錄結構以下:


其中,classpathweb項目的類路徑,能夠理解爲classes下面。由於不管這些配置文件放在哪,編譯以後若是沒有特殊狀況的話都直接在classes下面。jar包的話雖然放在lib文件夾裏,但實際上那些類能夠直接引用,好比:com.test.ABC,彷彿也在classes下面同樣。
在咱們的工程裏,通過驗證,maven工程這兩個

 路徑通過編譯後生成的文件都位於classes目錄下,即這兩個路徑至關於類路徑,在下面建立config文件夾(folder),而後建立自定義的xml配置文件便可。
classpathclasspath*區別:
同名資源存在時,classpath只從第一個符合條件的classpath中加載資源,而classpath*會從全部的classpath中加載符合條件的資源。classpath*,須要遍歷全部的classpath,效率確定比不上classpath,所以在項目設計的初期就儘可能規劃好資源文件所在的路徑,避免使用classpath*來加載。
  1. ContextLoaderListenerDispatcherServlet初始化上下文關係和區別:


從上圖能夠看出,ContextLoaderListener初始化的上下文加載的Bean是對於整個應用程序共享的,通常如:DAO層、ServiceBeanDispatcherServlet初始化的上下文加載的Bean是隻對Spring MVC有效的Bean,如:ControllerHandlerMappingHandlerAdapter等,該初始化上下文只加載Web相關組件。
注意:用戶能夠配置多個DispatcherServlet來分別處理不一樣的url請求,每一個DispatcherServlet上下文都對應一個本身的子Spring容器,他們都擁有相同的父Spring容器(業務層,持久(daobean所在的容器)。

10.<welcome-file-list></welcome-file-list>

1 <!-- welcome page -->
2 <welcome-file-list>
3     <welcome-file>index.html</welcome-file>
4 </welcome-file-list>

 

<welcome-file-list>包含一個子元素<welcome-file><welcome-file>用來指定首頁文件名稱。<welcome-file-list>元素能夠包含一個或多個<welcome-file>子元素。若是在第一個<welcome-file>元素中沒有找到指定的文件,Web容器就會嘗試顯示第二個,以此類推。
 

參考文獻:

http://wiki.metawerx.NET/wiki/Web.xml

http://www.cnblogs.com/konbluesky/articles/1925295.html

http://blog.csdn.Net/sapphire_aling/article/details/6069764

http://blog.csdn.net/zndxlxm/article/details/8711626

http://blog.csdn.net/zhangliao613/article/details/6289114

http://www.cnblogs.com/bukudekong/archive/2011/12/26/2302081.html

http://blog.sina.com.cn/s/blog_92b93d6f0100ypp9.html

http://blog.csdn.net/heidan2006/article/details/3075730

http://zhidao.baidu.com/link?url=vBOBj5f2D1Zx3wSUJo-XphWrG6f7QPmfzk0UtS9Xk7p1SG_OdeCkiH6dT6eyHO-Pa6p4hLTEfvY7O9d_OM0Gua

http://www.blogjava.net/dashi99/archive/2008/12/30/249207.html

http://uule.iteye.com/blog/2051817

http://blog.csdn.net/javaer617/article/details/6432654

http://blog.csdn.net/seng3018/article/details/6758860

http://groups.tianya.cn/tribe/showArticle.jsp?groupId=185385&articleId=2704257273118260804105385

http://blog.csdn.net/qfs_v/article/details/2557128

http://www.blogjava.net/fancydeepin/archive/2013/03/30/java-ee_web-xml.html

http://wenku.baidu.com/link?url=P30DokIynD5zzRU2dtdkQhEwsHi-REKuBiHa_dK60bA6pQwggvX2mo9y9Mbb1tkYcsiRCaHBf-c

4ZgIG5POmbbcRO_OxDJUaW15n300xJrq 

http://fyq891014.blog.163.com/blog/static/200740191201233052531278/ 

http://blog.163.com/sir_876/blog/static/11705223201111544523333/ 

http://www.guoweiwei.com/archives/797 

http://www.open-open.com/lib/view/open1402751642806.html 

 

http://www.micmiu.com/j2ee/spring/spring-classpath-start/

http://elf8848.iteye.com/blog/2008595

http://blog.csdn.net/arvin_qx/article/details/6829873

輕量級javaEE企業應用實戰(第3版) ---李剛

相關文章
相關標籤/搜索