1. 程式人生 > >Filter + Listener

Filter + Listener

Filter(過濾器)

可以對請求(響應)進行過濾 
對web伺服器管理的web資源進行攔截; 實現一些特殊功能的,例如對敏感訊息,對url進行過濾等

 

過濾器的建立和使用 :

        1.建立類,實現Filter介面; 

        2.添加註解,@WebFilter(urlPattern="要過濾的路徑");

        3.方法重寫:init,doFilter,destory;

        4.在doFilter方法中控制請求是否前進到下一個過濾器
            (1)前進
                filterChain.doFilter(request, response); 
            (2)停止(不呼叫doFilter方法)


匹配路徑

         1)精確匹配: 目標路徑是過濾器路徑就是什麼   
                                   @WebFilter(  urlPattrens= " /s1 " )

         2)字首匹配: /user/s1 ,  /user/s2 匹配所有以 user 開頭的路徑
                                   @WebFilter( urlPattrens=" /user/* ")   
                                   @WebFilter( urlPattrens=" /* ") 匹配此應用程式中的所有路徑  

         3)字尾匹配: 格式:  *.xxx
                                   @WebFilter( urlPattrens=" *.jsp ")  匹配以所有的 .jsp 結尾的路徑


多個過濾器: 使用@WebFilter去控制匹配路徑時,多個過濾器都匹配目標,執行順序和過濾器類名有關。 按類名的字母順序排序

 

web.xml配置檔案

寫一個servlet 要在類上加一個 @WebServlet(urlPatterns="")
寫一個filter 要在類上加一個 @WebFilter(urlPatterns="")
這種基於註解的寫法在servlet 3.0 才有的

web.xml是另一種配置方式,跟註解方式配置的作用是一樣的
xml (x 可擴充套件 markup 標記 language 語言) 標籤可以進行擴充套件
html (超文字標記語言) 標籤都是規定死的 <a> <h1> <p> ...

1)配置servlet

```
<!-- 配置一個servlet -->
<servlet>
    <!-- servlet名字 -->
    <servlet-name>servlet1</servlet-name>
    <!-- servlet對應的java類 -->
    <servlet-class>controller.Servlet1</servlet-class>
	<!-- 在tomcat啟動時就建立servlet的例項,而不是等到第一次請求時
         其中數字表示優先順序,數字小的優先順序高
    -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>servlet1</servlet-name>
    <!-- servlet的路徑 -->
    <url-pattern>/s1</url-pattern>
</servlet-mapping>

<!-- 等價於 @WebServlet(urlPatterns = "/s1", loadOnStartup = 1 ) -->
```


2)配置filter

```
<filter>
    <!-- 過濾器名字 -->
    <filter-name>f1</filter-name>
    <!-- 過濾器對應的java類 -->
    <filter-class>filter.Filter1</filter-class>
</filter>

過濾器的過濾順序可以通過 filter-mapping標籤的順序調整,先進入filter-mapping在前面的過濾器
<filter-mapping>
    <filter-name>f1</filter-name>
    <!-- 過濾器要過濾的路徑 -->
    <url-pattern>/ *</url-pattern>
</filter-mapping>
<!-- 等價於 @WebFilter(urlPatterns="/*") -->
```


3)配置session的生存時間

當第一次呼叫 request.getSession() 會建立HttpSession會話
銷燬有兩種:
1) session.invalidate(); 會立刻銷燬session
2) 兩次請求的時間間隔超過30分鐘,session會銷燬

```
<session-config>
    <!-- 配置session的超時時間, 單位是分鐘 -->
    <session-timeout>10</session-timeout> 
</session-config>
```

 

監聽器  (Listener)

常見的監聽物件
1. 域物件的建立和銷燬

1)ServletContextListener 監聽應用程式啟動和停止事件

2)ServletRequestListener request物件建立和銷燬事件

3)HttpSessionListener    session物件建立和銷燬事件


2. 域物件屬性更改

1) ServletContextAttributeListener application作用域 setAttribute,removeAttribute事件

2) ServletRequestAttributeListener request作用域 setAttribute,removeAttribute事件

3) HttpSessionAttributeListener  session 作用域 setAttribute,removeAttribute事件

 

session的 鈍化  和  啟用 

1) 當tomcat伺服器停止時,會把session中所有變數儲存到磁碟上, 稱為鈍化 (java序列化)

2) 當tomcat伺服器重新啟動時,把剛才存入磁碟的資訊讀取出來,恢復至session作用域, 稱為啟用 (java反序列化)

注意 : 
       向Session中儲存的變數要實現序列化介面(Serializable)
       都是針對自定義的java類,如:Student, Hero

 

監聽器的建立和使用

1)建立一個類,實現監聽器介面
2)重寫方法
3)添加註解 : @WebListener (或者web.xml中配置)