1. 程式人生 > >URL重寫、Filter(過濾器)、監聽器(Listener)

URL重寫、Filter(過濾器)、監聽器(Listener)

14.URL重寫     也屬於會話追蹤技術的一種.

    URL重寫解決了這樣一個問題:     當前瀏覽器把cookie禁用之後,瀏覽器在發請求的時候,就不會把cookie帶到伺服器端了(其中最重要的也包括JSESSIONID),因為禁用cookie之後瀏覽器拒絕一切站點向瀏覽器寫入cookie的(注意再禁用之前是否已經有一些已經存在的cookie了),這樣的話,多個請求就不能在伺服器端拿到同一個session物件了(因為傳送請求的時候沒有把JSESSIONID的值傳給伺服器)。

    把JSESSIONID從客戶端傳給伺服器,有倆種方式:     1.JSESSIONID儲存在cookie檔案中,瀏覽器傳送請求的時候把這個cookie檔案中的資料帶給伺服器(cookie).

        2.通過傳參的方式,把JSESSIONID的值通過要訪問的URL傳給伺服器.(URL重寫)

         如何實現URL重寫:     String url = resp.encodeURL("..");     這個方法引數就是我們要訪問的URL,這個方法會把重寫後的URL以字串的形式返回.

    例如:在一個超連結中,本來要訪問的URL是:<a href="GetDataFromSession">          重寫後:     <a href="GetDataFromSession;jsessionid=5480EF9016295A73DC56731A2F123246">     

    15.Filter(過濾器)     作用:在一個請求去訪問某個資源的時候,filter可以在這個請求訪問到這個資源之前,把請求攔下,然後做出一系列的處理或者判斷(比如編碼的轉換,資訊的過濾、許可權的判斷、是否已經登入的驗證等等),最後filter再決定是否要讓這個請求去訪問那個資源.

    如何寫一個filter:     寫一個java類,然後實現javax.Servlet.Filter介面

    這個介面中有三個方法:     init  destroy  doFilter     init:這個過濾器類被伺服器建立物件的時候會呼叫到這個方法。     destroy:過濾器物件被銷燬的時候會呼叫這個方法。     doFilter:當過濾器攔截到請求的時候,會呼叫這個doFilter.          注意:     public void doFilter(ServletRequest req, ServletResponse res,             FilterChain chain)

    這個方法有三個引數,第三個引數表示的一個過濾器鏈物件,因為同一個請求有可能要依次的通過倆個或者多個過濾器,在web中把這樣多個過濾器看做一個過濾器鏈條物件,就是用這個FilterChain型別的物件來表示。     chain.doFilter(req,res)表示把當前的req和res傳給這個過濾器鏈條中的下一個過濾器進行過濾,如果說鏈條中已經沒有下一個過濾器,那麼就把這次訪問放行,讓它去訪問它真正要訪問的資源.

    注意:如果這次訪問沒有符合過濾器中的條件,那麼我們就不用呼叫chain.doFilter(req,res)這個方法把這次訪問放行了,而是可以直接進行跳轉(伺服器內部跳轉或者客戶端重定向),跳轉到一個頁面,頁面中提示使用者一下,為什麼這次不讓他去訪問,比如說 還沒有登入、許可權不夠等等原因。

        最後還需要在web.xml檔案中進行配置:     例如:   <filter>       <filter-name>encodingFilter</filter-name>       <filter-class>com.briup.filter.EncodingFilter</filter-class>   </filter>      <filter-mapping>       <filter-name>encodingFilter</filter-name>       <url-pattern>/*</url-pattern>   </filter-mapping>

    這個配置和servlet的配置很相似。

    <url-pattern>/*</url-pattern>     表示當前這個過濾器,要攔截的路徑是/*,表示專案中所有的資源。          <url-pattern>/servlet/*</url-pattern>     表示當前這個過濾器,要攔截的路徑是/servlet/*,也就是專案下面的servlet路徑下面的所有資源.

    <url-pattern>/firstServlet</url-pattern>     表示當前這個過濾器,要攔截的路徑是/firstServlet,也就是說這個過濾器只會攔截這一個路徑.

    如果要攔截的路徑有倆個,我們可以配置倆個<filter-mapping>標籤分別都去和同一個<filter>標籤對應。

     注意:1.這裡的/代表位址列中專案名字後的/       2.某一個資源是不是會被攔截,要看位址列中會不會出現我們在web.xml檔案所配置的要攔截的路徑.

    16.監聽器(Listener)     作用:監聽web中的一些事件的發生,如果某些事件一旦發生了,那麼這個監聽器就會呼叫某些方法進行處理.     比如:在web中可以監聽request物件的建立和銷燬.

    如何去寫一個監聽器:     1.寫一個類,實現一個特點的介面。     2.在web.xml檔案中進行配置。     web.xml:      <listener>           <listener-class>com.briup.listener.RequestListener</listener-class>      </listener>          比如:     監聽request物件的建立和銷燬要實現介面ServletRequestListener     監聽session物件的建立和銷燬要實現介面HttpSessionListener     監聽application物件的建立和銷燬要實現介面  

    JSP   屬於動態網頁技術的一種.   (servlet、jsp、PHP、asp等等)