1. 程式人生 > >35、事件監聽器

35、事件監聽器

學習目標:

1、瞭解Servlet的監聽器類的作用

2、能在專案中靈活的使用監聽器

3、瞭解session會話的原理

學習過程:

一、監聽器

什麼是事件監聽器,是指支援ServletContext、HttpSession及ServletRequest中狀態改變的事件通知,在2.3規範後出現。實現了一個或多個servlet事件監聽器介面的型別。

監聽器類的規定,必須在部署描述符中配置實現類,最常用ServletContextListener和HttpSessionListener

1、ServletContextListener

ServletContextListener的作用一般是為整個WEB應用提供一些服務和支援。可以在伺服器啟動時做一些初始化的設定,或者伺服器銷燬是做一些回收操作等。

(1)ServletContextListener程式碼實現:


//應用程式監聽程式
public class ApplicationListner implements ServletContextListener {

	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("應用程式啟動了。");
	}

	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("應用程式關閉了了。");
	}

}

在web.xml的配置:

	<listener>
	   <listener-class>com.lisnster.ApplicationListner</listener-class>
	</listener>

2、HttpSessionListener

可以監聽新建或者銷燬session時候自動觸發

//每一個新的session訪問就會自動呼叫
public class SessionListener implements HttpSessionListener {

	public void sessionCreated(HttpSessionEvent arg0) {
		System.out.println("一個新的session建立了。");
		
	}

	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("一個session銷燬了。");
		
	}

}

在web.xml的配置:

	<listener>
	 <listener-class>com.lisnster.SessionListener</listener-class>
	</listener>

二、session實現機制

我們前面講過http協議是一種無狀態的協議,是一次連線,伺服器本身並不能區分出當前是哪一個瀏覽器在訪問它,以為一次連線後就斷開這個連線了,那麼我們的的Session儲存的資料又是如何實現的呢。伺服器是如何區分當前是哪一個會話呢?各種網頁程式語言如:asp.net php java都實現了自己的一套session管理機制的:

1、伺服器需要一個很好的辦法來區分不同的瀏覽器的會話,就是每一個新的使用者訪問伺服器時都會為其分配一個唯一的sessionid。所有每一個會話都會分配一個唯一標識。

2、因為伺服器需要知道這個客戶端是哪一個,伺服器需要在客戶端與伺服器間不停的傳遞sessionid的,會話狀態的維護就是要靠增加這個來做到的吧,這個操作不需要我們使用者或者程式設計師操作的,有瀏覽器和伺服器之間自動完成。當然我們明白這個機制後,也可以自己寫一個http的連線,然後儲存這個sessionid,這樣我們就可以儲存和伺服器的會話了。

3、這個sessionid既保持在伺服器,也儲存在客戶端,第一次訪問是有伺服器生成,併發回給瀏覽器,瀏覽器以後每次訪問服務都會發給伺服器。舉個例子來說吧,比如你第一天上班,公司會給你辦一張門禁卡,以後你天天上班都要帶著這張門禁卡打卡,公司就知道是你來上班了。

在客戶端一般sessionid是儲存在cookie中的,如果cookie禁用了,那麼會一get的方式在url中傳送給伺服器。當用戶關閉瀏覽器是,伺服器事實上是不知道的,sessionid會在預設會在使用者不訪問30分鐘後才會把這個session銷燬。大家也可以登入tomcat的伺服器介面看看當前有幾個sessionid在儲存著。

這裡我們以apache-tomcat-7.0.85為例子,不同tomcat的使用者的配置有些不一樣,所以大家要注意了,先新增一個管理使用者,開啟tomcat的目錄下的conf目錄下的tomcat-users.xml,開啟這個檔案,發現內容很多,其實都是註釋,在這裡新增一個使用者就可以了。

 <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

開啟tomcat的管理介面http://localhost:8080/。點選Tomcat Manager。

出現登入介面,輸入你剛才新增的使用者名稱和密碼就可以了。

這時候你可以看到所有的專案,你可以看到當前有幾個session,點選這個數字就可以看到sessionid了。

這個就是隨機生成的儲存在伺服器的ssessionid

開啟瀏覽器在cookie中也可以看到這個sessionid,每一次用於提交都會帶上這個sessionid,這樣服務端就知道是那一個會話了。

sessionid是儲存在客戶端,所以session id 應該是可以被監聽到,然後偽造攻擊的。看一下cookie儲存的sessionid的名字:JSESSIONID。和伺服器儲存的Session Id是一樣的,

當你關閉瀏覽器,事實上伺服器是不知道的,只有當這個sessionId超過了指定的時間沒有再次訪問伺服器,伺服器才會把這個sessionId給刪除,預設是30分鐘,當然也是可以修改的,比如修改成為60分鐘,開啟web.xml,新增程式碼如下:

 <session-config>
  <session-timeout>60</session-timeout>
 </session-config>