程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Javaweb——過濾器映射,javaweb過濾器

Javaweb——過濾器映射,javaweb過濾器

編輯:JAVA綜合教程

Javaweb——過濾器映射,javaweb過濾器


什麼是過濾器?

過濾器:從字面上看,可以理解為將具有雜質的水過濾,留下干淨的水。那麼從IT的角度上理解。過濾器:是處在源數據(數據庫之類的)和目標數據(顯示頁面)的中間組件。對於Web應用來說,過濾器是駐留在服務器上的Web組件,它可以截取客戶端和資源之間的請求和響應信息,並對這些信息進行過濾。

當Web容器(服務器)接收到一個對資源數據的請求時,它會判斷過濾器和這個請求是不是有關聯,如果有,它將這個請求交給過濾器處理,然後在過濾器中,你可以改變請求的內容,然後再將請求給目標資源。

[請求—>Web容器—>過濾器—>目標資源]

當目標資源對請求作出響應時,Web容器同樣會向轉發給過濾器,在過濾器你可以對響應的內容進行改變,然後再發送給顯示頁面。

[目標資源—>Web容器—>過濾器—>顯示頁面]

過濾器的生命周期

  過濾器的生命周期與web容器相同,當web容器啟動時,就會讀取應用的web.xml配置文件,如果這裡配置了過濾器,容器就會執行實例化,並調用過濾器的init方法。

  之後用戶的每一次請求都會執行過濾器的doFilter方法。

  當web容器銷毀時,就會執行destroy方法,釋放資源。

 

過濾器的執行過程

 

用戶在發送請求後,如果該請求滿足過濾器的過濾規則,web容器就會執行過濾器中的doFilter方法進行特定的操作;然後通過調用FilterChain.doFilter轉交給web容器。web容器執行完成後把資源返回給過濾器,再展現給用戶。

簡單的過濾器實例

  下面通過一個簡單的代碼,看看過濾器的編寫。

  首先,需要創建一個過濾器,過濾器集成javax.servlet.Filter接口,其中必須實現三個方法:init() doFilter() destroy()

package com.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

//定義類繼承Filter,定義過濾器
public class myFilter implements Filter {

    public myFilter() {
      
    }
    //銷毀
    public void destroy() {
        
        System.out.println("myFilter destroy");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        System.out.println("myFilter start..dofilter");
        //請求放行        
        HttpServletRequest req = (HttpServletRequest)request;
        req.getRequestDispatcher("index.jsp").forward(request, response);
        System.out.println("myFilter end..fofilter");
    }
  //初始化
    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("myFilter init");
    }

}

 init()方法是在web容器實例化過濾器時調用的。

 doFilter()方法是每次有請求,且滿足過濾規則時調用。

 destroy()方法是web容器關閉時,調用。

 

然後,在web.xml中配置相應的選項。如果是servlet3.0,那麼支持注解的方式配置過濾器。

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.filter.myFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
</filter-mapping>

其中幾個必備的項:

  在<filter>中配置了過濾器,filter-name是過濾器的名字,filter-class是過濾器的類;

  在<filter-mapping>中配置了過濾器的映射規則,filter-name是過濾器的名字,url-pattern是過濾的路徑,dispatcher是過濾器的分類(主要包括四種)

  這裡先說下過濾器的規則,如果想要全部的請求都過濾,那麼可以寫/*

  如果想要過濾index.jsp  index.html 可以寫/index*

  如果只想過濾index.jsp,可以寫成/index.jsp

其次,配置好後,創建index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> This is Filter JSP! <% System.out.println("index jsp"); %> </body> </html> View Code

最後,當啟動web容器後,可以在控制台中發現,初始化時,執行了init方法

 

 

 

 

 

 

 

無敵分割線-------------------------------------------------------------------------------

過濾器(filter)在web 中的應用

過濾器(Filter)在Web開發中的應用:

 

Filter是從Servlet2.3規范開始新增的功能,並在Servlet2.4規范中得到增強。以下是

Filter在Web開發中的應用。

 

過濾器概述:

過濾器就是在源數據和目的數據之間起過濾作用的中間組件。對Web應用來說,過濾器是一個駐留在服務器端的Web組件,它可以截取客戶端和資源之間的請求與響應信息,並對這些信息進行過濾。

 

當Web容器接受到一個對資源的請求時,它將判斷是否有過濾器與這個資源相關聯。如果有,那麼容器將把請求交給過濾器進行處理。在過濾器中,你可以改變請求的內容,或者重新設置請求的報頭信息,然後再將請求發送給目標資源。當目標資源對請求作出響應時候,容器同樣會將響應先轉發給過濾器,再過濾器中,你可以對響應的內容進行轉換,然後再將響應發送到客戶端。

 

過濾器在Web開發中的一些主要應用:

 

·對用戶請求進行統一認證。

 

·對用戶的訪問請求進行記錄和審核。

 

·對用戶發送的數據進行過濾或替換。

 

·轉換圖象格式。

 

·對響應內容進行壓縮,減少傳輸量。

 

·對請求或響應進行加解密處理

 

·觸發資源訪問是事件。

 

·對XML的輸出應用XSLT。

 

Filter API :

 

與過濾器開發相關的接口與類都包含在javax.serlvet和javax.servlet.http包中,主要有下面的接口和類。

 

·javax.servlet.Filter接口

 

·javax.servlet.FilterConfig接口

 

·javax.servlet.FilterChain接口

 

·javax.servlet.ServletRequestWrapper類

 

·javax.servlet.ServletResponseWrapper類

 

·javax.servlet.http.HttpServletRequestWrapper類

 

·javax.servlet.http.HttpServletResponseWrapper類

 

Filter接口:

 

開發過濾器要實現javax.servlet.Filter接口,與開發servlet要實現javax.servlet.Servlet接口類似。提供了一個公開的不帶參數的構造方法。在Filter接口中,定義了下面的三個方法:

 

·public void init(FilterConfig filterConfig)throws ServletException

 

Web容器調用該方法該方法來初始化過濾器。容器在調用該方法時,向過濾器傳遞FIlterConfig對象,FilterConfig的用法和ServletConfig(參見以前相關內容)類似。利用FilterConfig對象可以得到ServletContext對象,以及部署描述符中配置的過濾器的初始化參數。在這個方法中,可以拋出ServletException異常,通知容器該過濾器不能正常工作。

 

·public void doFilter(ServletRequest request,ServletResponse

response,FilterChain chain)throws java.io.IOException,ServletException

 

doFilter()方法類似於Servlet接口的service()方法。當客戶端請求目標資源的時候,容器就會調用與這個目標資源相關聯的過濾器的doFilter()方法。在特定的操作完成後,可以調用chain.doFilter(request,response)將請求傳給下一個過濾器(或目標資源),也可以直接向客戶端返回響應信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法將請求轉向到其他資源。需要注意的是,這個方法的請求和響應參數的類型是ServletRequest和ServletResponse,也就是說,過濾器的使用並不依賴於具體的協議。

 

·public void destroy()

 

Web容器調用該方法指示過濾器的生命周期結束。在這個方法中,可以釋放過濾器使用的資源。與開發Servlet不同的是,Filter接口並沒有相應的實現類可供繼承,要開發過濾器,

只能直接實現Filter接口。

 


FilterConfig接口:

javax.servlet.FilterConfig接口類似於javax.servlet.ServletConfig接口,用於在過濾器初始化時,向其傳遞信息。FilterConfig接口有容器實現,容器將其作為參數傳入過濾器對象的init()方法中。在FilterConfig接口,定義了4個方法:

 

·public java.lang.String getFilterName()

 

得到描述符中指定的過濾器的名字。

 

·public java.lang.String getInitParameter(java.lang.String name)


  返回在部署描述中指定的名字為name的初始化參數的值。如果不存在返回null.

 

·public java.util.Enumeration getInitParameterNames()


  返回過濾器的所有初始化參數的名字的枚舉集合。

 

·public ServletContext getServletContext()


  返回Servlet上下文對象的引用。

 

 

 

FilterChain接口:

 

FilterChain接口由容器實現,容器將其實例作為參數傳入過濾器對象的doFilter()方法中。過濾器對象使用FilterChain對象調用過濾器鏈中的下一個過濾器,如果該過濾

器是鏈中最後一個過濾器,那麼將調用目標資源。FilterChain接口只有一個方法,如下:

 

·public void doFilter(ServletRequest request,ServletResponse response)

throws java.io.IOException

 

調用該方法將使過濾器鏈中的下一個過濾器被調用。如果是最後一個過濾器,會調用目標資源。

 


過濾器的部署:

 

在實現一個過濾器後,需要在部署描述符中對過濾器進行配置,這是通過<filter>和<filter-mapping>元素來完成的。

<filter>元素用於在Web應用程序中聲明一個過濾器。


在<filter>元素內,<description>、<display-name>、<icon>元素和以往servlet的配置中的相同。<filter-name>用於為過濾器指定一個名字,該元素的內容不能為空。

<filter-class>元素用於指定過濾器的完整的限定類名。<init-param>元素用於為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參

數的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。

 

 

 

下面是<filte>元素的一個小例子:

<filter>
 <filter-name>testFitler</filter-name>
 <filter-class>org.test.TestFiter</filter-class>
 <init-param>
  <param-name>word_file</param-name>
  <param-value>/WEB-INF/word.txt</param-value>
 </init-param>
</filter>

 

Servlet容器對部署描述符中聲明的每一個過濾器,只創建一個實例。與Servlet類似,容器將在同一個過濾器實例上運行多個線程來同時為多個請求服務,因此,開發過濾器

時,也要注意線程安全的問題。

 

<filter-mapping>元素用於指定過濾器關聯的url樣式或者Servlet。

其中<filter-name>子元素的值必須是在<filter>元素中聲明過的過濾器的名字。

<url-pattern>元素和<servlet-name>元素可以選擇一個;

<url-pattern>元素指定過濾器關聯的URL樣式;

<servlet-name>元素指定過濾器對應的Servlet。

用戶在訪問<url-pattern>元素指定的URL上的資源或<servlet-name>元素指定的Servlet時,該過濾器才會被容器調用。

<filter-mapping>元素還可以包含0到4個<dispatcher>,指定過濾器對應的請求方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST.

 

·REQUEST
  當用戶直接訪問也面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麼該過濾器就不會被調用。

 

·INCLUDE
  如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用。

 

·FORWARD
  如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被調用,除此之外,該過濾器不會被調用。

 

·ERROR
  如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將被調用。除此之外,過濾器不會被調用。


例子:

<filter-mapping>
 <filter-name>testFilter</filter-name>
 <url-pattern>/test.jsp</url-pattern>
</filter-mapping>
當用戶訪問test.jsp頁面時,容器就會調用testFilter過濾器。

<filter-mapping>
 <filter-name>testFilter</filter-name>
 <url-pattern>/index.jsp</url-pattern>
 <dispatcher>REQUEST</dispatcher>
 <dispatcher>FORWARD</dispatcher>
</filter-mapping>

當用戶直接訪問index.jsp頁面,或者通過RequestDispatcher的forward()方法訪問時,容器就會調用testFilter過濾器。

內容來源:(怕丟失,故記之,見諒)

http://www.ylzx8.cn/web/web/979338.html

http://www.cnblogs.com/xing901022/p/4482057.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved