當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 編程語言 » java的filter

java的filter-九游会j9娱乐平台

發布時間: 2024-06-30 23:32:12

㈠ 什麼是java過濾器! 它的功能和作用是什麼啊

filter 技術是servlet 2.3 新增加的功能.servlet2.3是sun公司與2000年10月發布的,它的開發者包括許多個人和公司團體,充分體現了sun公司所倡導的代碼開放性原則.由於眾多的參與者的共同努力,servlet2.3比以往功能都強大了許多,而且性能也有了大幅提高.
它新增加的功能包括:
1. 應用程序生命周期事件控制;
2. 新的國際化;
3. 澄清了類的裝載規則;
4. 新的錯誤及安全屬性;
5. 不贊成使用httputils 類;
6. 各種有用的方法;
7. 闡明並擴展了幾個servlet dtd;
8. filter功能.
其中最重要的就是filter功能.它使用戶可以改變一個request和修改一個 response. filter 不是一個servlet,它不能產生一個response,它能夠在一個request到達servlet之前預處理request,也可以在離開 servlet時處理response.換種說法,filter其實是一個」servlet chaining」(servlet 鏈).一個filter 包括:
1. 在servlet被調用之前截獲;
2. 在servlet被調用之前檢查servlet request;
3. 根據需要修改request頭和request數據;
4. 根據需要修改response頭和response數據;
5. 在servlet被調用之後截獲.
你能夠配置一個filter 到一個或多個servlet;單個servlet或servlet組能夠被多個filter 使用.幾個實用的filter 包括:用戶辨認filter,日誌filter,審核filter,加密filter,符號filter,能改變xml內容的xslt filter等.
一個filter必須實現javax.servlet.filter介面並定義三個方法:
1.void setfilterconfig(filterconfig config) //設置filter 的配置對象;
2. filterconfig getfilterconfig() //返回filter的配置對象;
3. void dofilter(servletrequest req, servletresponse res, filterchain chain) //執行filter 的工作.
伺服器每次只調用setfilterconfig方法一次准備filter 的處理;調用dofilter方法多次以處理不同的請求.filterconfig介面有方法可以找到filter名字及初始化參數信息.伺服器可以設置 filterconfig為空來指明filter已經終結.
每一個filter從dofilter()方法中得到當前的request及 response.在這個方法里,可以進行任何的針對request及response的操作.(包括收集數據,包裝數據等).filter調用 chain.dofilter()方法把控制權交給下一個filter.一個filter在dofilter()方法中結束.如果一個filter想停止 request處理而獲得對response的完全的控制,那它可以不調用下一個filter.
一個filter可以包裝request 或response以改變幾個方法和提供用戶定製的屬性.api2.3提供了httpservletrequestwrapper 和httpservletresponsewrapper來實現.它們能分派最初的request和response.如果要改變一個方法的特性,必須繼承wapper和重寫方法.下面是一段簡單的日誌filter用來記錄所有request的持續時間.
public class logfilter implements filter {
filterconfig config;
public void setfilterconfig(filterconfig config) {
this.config = config;
}
public filterconfig getfilterconfig() {
return config;
}
public void dofilter(servletrequest req,
servletresponse res,
filterchain chain) {
servletcontext context = getfilterconfig().getservletcontext();
long bef = system.currenttimemillis();
chain.dofilter(req, res); // no chain parameter needed here
long aft = system.currenttimemillis();
context.log("request to " req.getrequesturi()
": " (aft-bef));
}
}
當server調用setfilterconfig(),filter保存config信息. 在dofilter()方法中通過config信息得到servletcontext.如果要運行這個filter,必須去配置到web.xml中.以 tomcat4.01為例:


log //filter 名字


logfilter //filter class(上例的servlet)



log
servletname


servletname
servletclass


servletname
*

把這個web.xml放到web-inf中(詳請參考tomcat幫助文檔).
當每次請求一個request時(如index.jsp),先到logfilter中去並調用dofilter()方法,然後才到各自的servlet中去.如果是一個簡單的servlet(只是一個頁面,無任何輸出語句),那麼可能的輸出是:
request to /index.jsp: 10
filter是一個com組件,由一個或多個pin組成。pin也是一個com組件。 filter文件的擴展名為.ax,但也可以是.dll。filter根據其包含input pin或output pin的情況(或在filter graph的位置),大致可分為三類:source filter(僅有output pin)、transform filter(同時具有input pin和output pin)和renderer filter(僅有input pin)。
一般情況下,創建filter使用一個普通的win32 dll項目。而且,一般filter項目不使用mfc。這時,應用程序通過cocreateinstance函數filter實例;filter與應用程序在二進制級別的協作。另外一種方法,也可以在mfc的應用程序項目中創建filter。這種情況下,filter不需注冊為com組件,filter與應用程序之間的協作是源代碼級別的;創建filter實例,不再使用cocreateinstance函數,而是直接new出一個filter對象,如下:
m_pfilterobject = new cfilterclass();
// make the initial refcount 1 to match com creation
m_pfilterobject ->addref();
因為filter的基類實現了對象的引用計數,所以即使在第二種情況下,對創建後的filter對象的操作也完全可以遵循com標准。
filter是一個獨立功能模塊,最好不要將filter依賴於其他第三方的dll。因為 filter具有com的位置透明性特點,filter文件可以放在硬碟的任何位置,只要位置移動後重新注冊。但此時,如果filter依賴其他dll,則filter對該dll的定位就會出現問題。
filter不能脫離filter graph單獨使用。所以,如果你想繞過filter graph直接使用filter實現的模塊功能,請將你的filter移植成dmo(directx media object)。對於directshow應用程序開發者來說,還有一點,請不要忘記使用oleinitialize進行初始化。
2. filter的注冊
filter是com組件,所以在使用前一定要注冊。filter的注冊程序為 regsvr32.exe。如果帶上命令行參數/u,表示注銷;如果帶上是/s,表示不彈出任何注冊/注銷成功與否的提示對話框。如果你想在build filter項目的時候進行自動注冊,請在vc的project settings的custom build頁如下設置:
description: register filter
commands: regsvr32 /s /c $(targetpath)
echo regsvr32 exe.time > $(targetdir)\$(targetname).trg
outputs: $(targetdir)\$(targetname).trg
filter的注冊信息包括兩部分:基本的com信息和filter信息。注冊信息都存放在注冊表中。前者的位置為:hkey_classes_root\clsid\filter clsid\,後者的位置為:hkey_classes_root\clsid\category\instance\ filter clsid\。com信息標示了filter是一個標準的可以通過cocreateinstance函數創建的com組件,filter信息標示了我們通過graphedit看到的描述這個filter的信息。如果你不想讓graphedit看到(或者讓filter枚舉器找到)你寫的filter,你完全可以不注冊filter信息。而且不用擔心,你這么做也完全不會影響filter的功能。
屏蔽注冊filter信息的方法也很簡單。因為cbasefilter實現了iamoviesetup介面的兩個函數:register和unregister。我們只需重載這兩個函數,直接return s_ok就行了。
filter的merit值。這個值是微軟的「智能連接」函數使用的。在graphedit中,當我們加入一個source filter後,在它的pin上執行「render」,會自動連上一些filter。merit的值參考如下:
merit_preferred = 0x800000,
merit_normal = 0x600000,
merit_unlikely = 0x400000,
merit_do_not_use = 0x200000,
merit_sw_compressor = 0x100000,
merit_hw_compressor = 0x100050
merit值只有大於merit_do_not_use的時候才有可能被「智能連接」使用;merit的值越大,這個filter的機會就越大。
3. filter之間pin的連接過程
filter只有加入到filter graph中並且和其它filter連接成完整的鏈路後,才會發揮作用。filter之間的連接(也就是pin之間的連接),實際上是連接雙方的一個 media type的協商過程。連接的方向總是從output pin指向input pin。連接的大致過程為:如果調用連接函數時已經指定了完整的media type,則用這個media type進行連接,成功與否都結束連接過程;如果沒有指定或不完全指定了media type,則進入下面的枚舉過程。枚舉欲連接的input pin上所有的media type,逐一用這些media type與output pin進行連接(如果連接函數提供了不完全media type,則要先將每個枚舉出來的media type與它進行匹配檢查),如果output pin也接受這種media type,則pin之間的連接宣告成功;如果所有input pin上枚舉的media type,output pin都不支持,則枚舉output pin上的所有media type,並逐一用這些media type與input pin進行連接。如果input pin接受其中的一種media type,則pin之間的連接到此也宣告成功;如果output pin上的所有media type,input pin都不支持,則這兩個pin之間的連接過程宣告失敗。
每個pin都可以實現getmediatype函數來提供該pin上支持的所有 preferred media type(但一般只在output pin上實現,input pin主要實現checkmediatype看是否支持當前提供的media type就行了)。連接過程中,pin上枚舉得到的所有media type就是這里提供的。
在cbasepin類中有一個protected的成員變數 m_btrymytypesfirst,默認值為false。在我們定製filter的output pin中改變這個變數的值為true,可以定製我們自己的連接過程(先枚舉output pin上的media type)。
當pin之間的連接成功後,各自的pin上都會調用completeconnect函數。我們可以在這里取得一些連接上的media type的信息,以及進行一些計算等。在output pin的completeconnect實現中,還有一個重要的任務,就是協商filter graph運行起來後sample傳輸使用的內存配置情況。這同樣是一個交互過程:首先要詢問一下input pin上的配置要求,如果input pin提供內存管理器(allocator),則優先使用input pin上的內存管理器;否則,使用output pin自己生成的內存管理器。我們一般都要實現decidebuffersize來決定存放sample的內存大小。注意:這個過程協商完成之後,實際的內存並沒有分配,而要等到output pin上的active函數調用。
4. filter media type概述
media type一般可以有兩種表示:am_media_type和cmediatype。前者是一個struct,後者是從這個struct繼承過來的類。
每個media type有三部分組成:major type、subtype和format type。這三個部分都使用guid來唯一標示。major type主要定性描述一種media type,比如指定這是一個video,或audio或stream等;subtype進一步細化media type,如果video的話可以進一步指定是uyvy或yuy2或rgb24或rgb32等;format type用一個struct更進一步細化media type。
如果media type的三個部分都是指定了某個具體的guid值,則稱這個media type是完全指定的;如果media type的三個部分中有任何一個值是guid_null,則稱這個media type 是不完全指定的。guid_null具有通配符的作用。
常用的major type:
mediatype_video;
mediatype_audio;
mediatype_analogvideo; // analog capture
mediatype_analogaudio;
mediatype_text;
mediatype_midi;
mediatype_stream;
mediatype_interleaved; // dv camcorder
mediatype_mpeg1systemstream;
mediatype_mpeg2_pack;
mediatype_mpeg2_pes;
mediatype_dvd_encrypted_pack;
mediatype_dvd_navigation;
常用的subtype:
mediasubtype_yuy2;
mediasubtype_yvyu;
mediasubtype_yuyv;
mediasubtype_uyvy;
mediasubtype_yvu9;
mediasubtype_y411;
mediasubtype_rgb4;
mediasubtype_rgb8;
mediasubtype_rgb565;
mediasubtype_rgb555;
mediasubtype_rgb24;
mediasubtype_rgb32;
mediasubtype_argb32; // contains alpha value
mediasubtype_overlay;
mediasubtype_mpeg1packet;
mediasubtype_mpeg1payload; // video payload
mediasubtype_mpeg1audiopayload; // audio payload
mediasubtype_mpeg1system; // a/v payload
mediasubtype_mpeg1videocd;
mediasubtype_mpeg1video;
mediasubtype_mpeg1audio;
mediasubtype_avi;
mediasubtype_asf;
mediasubtype_qtmovie;
mediasubtype_pcm;
mediasubtype_wave;
mediasubtype_dvsd; // dv
mediasubtype_dvhd;
mediasubtype_dvsl;
mediasubtype_mpeg2_video;
mediasubtype_mpeg2_program;
mediasubtype_mpeg2_transport;
mediasubtype_mpeg2_audio;
mediasubtype_dolby_ac3;
mediasubtype_dvd_subpicture;
mediasubtype_dvd_lpcm_audio;
mediasubtype_dvd_navigation_pci;
mediasubtype_dvd_navigation_dsi;
mediasubtype_dvd_navigation_provider;
常用的format type:
format_none
format_dvinfo dvinfo
format_mpegvideo mpeg1videoinfo
format_mpeg2video mpeg2videoinfo
format_videoinfo videoinfoheader
format_videoinfo2 videoinfoheader2
format_waveformatex waveformatex
5. filter之間的數據傳送
filter之間的數據是通過sample來傳送的。sample是一個com組件,擁有自己的一段數據緩沖。sample由allocator統一管理。如下圖所示:
filter之間數據傳送的方式有兩種:push模式和pull模式。

㈡ filter的使用 java 過濾器的幾種使用方法

過濾器

過濾器是處於客戶端與伺服器資源文件之間的一道過濾網,在訪問資源文件之前,通過一系列的過濾器對請求進行修改、判斷等,把不符合規則的請求在中途攔截或修改。也可以對響應進行過濾,攔截或修改響應。

過濾器一般用於登錄許可權驗證、資源訪問許可權控制、敏感詞彙過濾、字元編碼轉換等等操作,便於代碼重用,不必每個servlet中還要進行相應的操作。

㈢ java 中的過濾器filter 都有什麼作用

java裡面有多種過濾器,有文件過濾器、請求過濾器等等。。,主要作用是過濾掉用戶不需要的東西或者設置請求編碼的格式等等。。

㈣ java過濾非法字元的filter

filter代碼在pujia12345提供的代碼上改的;
jsp頁面的編碼你設成你自己的,我用的是utf-8。
input.jsp輸入後,正常跳轉到handle.jsp,而禁詞已經被過濾。
filter:
package test;

import java.io.*;
import javax.servlet.*;
import java.util.*;

public class myfilter implements filter
{
private list unstring;

public void init(filterconfig filterconfig) throws servletexception
{
unstring = new arraylist();
unstring.add("日");
}

public void dofilter(servletrequest request, servletresponse response, filterchain chain)
throws ioexception, servletexception
{
string content = request.getparameter("content");//需要過濾的參數
if(content!=null){
for (int i = 0; i < unstring.size(); i )
{
string strillegal = unstring.get(i);
if (content.indexof(strillegal) >= 0)
{
content = content.replaceall(strillegal, "");//非法字元替換成空
}
request.setattribute("content", content);//為request設置屬性保存修改後的值
}
}
chain.dofilter(request, response);
}
public void destroy()
{
//system.out.println("過濾器銷毀");
}
}

//---------------------------//
web.xml:

myfilter
test.myfilter



myfilter
/*


//---------------------------//
輸入頁面input.jsp:

<%@page contenttype="text/html;charset=utf-8"%>



input.jsp










//---------------------------//
input提交的頁面handle.jsp:
<%@page contenttype="text/html;charset=utf-8"%>



handle.jsp



<%
string content = (string)request.getattribute("content");
out.println(content);
%>

㈤ java日誌的filter

filter可以視作是servlet的加強版,主要用作對用戶的請求進行預處理,或者對返回給客戶端的結果進行再次加工,是一個典型的鏈式處理模式。本篇簡單介紹filter的基本使用方法,主要涉及以下內容:

  • filter的背景知識

  • 使用filter的流程

  • filter的生命周期

  • 一個完整的實例

  • 一、filter的簡單介紹
    filter在英文中是過濾器的意思,當然在此處的使用也是完美的切合了它的意思,我們使用filter的主要目的就是完成一個過濾的作用。可以在一個請求到達servlet之前,將其截取進行邏輯判斷,然後決定是否放行到請求的servlet。也可以在一個response到達客戶端之前,截取結果進行邏輯判斷,然後決定是否允許返回給客戶端。所以filter有如下幾個種類:

  • 用戶授權的filter:filter負責判斷用戶是否有許可權請求該頁面,給予過濾判斷

  • 日誌filter:截取某個用戶在本網站上的所有請求,記錄軌跡

  • 負責解碼的filter:規定處理本次請求的解碼方式

  • 最後需要注意的是,一個filter過濾器可以加在多個servlet控制器上,當然多個filter過濾器也是可以加在一個servlet控制器上的。由此也是可以看出來,我們使用filter往往是對一些公共的操作進行處理,例如:判斷用戶許可權,解碼本次請求等,還比如,我們的web應用中某些頁面是需要用戶登錄後才能訪問的,以往我們都是在每個servlet頁面加上判斷控制,導致代碼冗餘,有了filter,我們可以定義一個實現了filter的過濾器,讓需要判斷是否登錄的頁面都加上這么一個過濾器,可以大大降低代碼的冗餘程度。

    二、filter的使用流程
    在java中如果想要自定義一個filter過濾器的話,需要繼承javax.servlet.filter介面,這個介面中只有三個方法:

  • default void init(filterconfig filterconfig)void dofilter(servletrequest var1, servletresponse var2, filterchain var3)default void destroy()

  • 其中init和destroy方法是有默認實現的,也就是我們不是必須重寫這兩個方法,但是dofilter 這個方法是一個核心的方法,是我們必須要實現的。首先我們看init方法的作用,這個方法是用來初始化filter實例的,也就是當用戶請求了某個攔截器而此攔截器又匹配了某個過濾器,此時web容器就會定位到該過濾器然後創建該filter類的實例對象並調用此實例的init方法,完成初始化工作。對於destroy方法毋庸置疑就是在過濾器執行結束的時候調用,主要完成對一些資源的釋放。下面主要看dofilter這個方法。
    dofilter方法是filter介面中的核心方法,一旦創建完該過濾器的實例之後,會執行dofilter方法,所有的過濾邏輯都是在此方法中進行的。主要有三個參數,第一個參數是一個servletrequest對象,httpservletrequest繼承於此介面,當用戶請求某個攔截器的時候,檢測到此請求存在過濾器,於是會封裝好本次請求的相關數據,傳遞給dofilter的servletrequest參數,servletresponse參數的來源和servletrequest是一樣的,都是由客戶端封裝過來的。至於第三個參數,這是一個filterchain處理鏈,詳細的介紹等說明了web.xml中配置filter之後。
    第一步如上,創建一個繼承自filter介面的類,並實現其中的三個方法。第二步是在web.xml中配置該類用於過濾哪些攔截器。web.xml代碼如下:


  • xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"

  • xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

  • version="3.1">



  • islogin

  • test_f.myfilter





  • islogin

  • /a




  • islogin

  • /b


  • 如上述的代碼,我們需要兩個操作,首先是定義一個filter,指定了該filter的name和相對應的過濾器類。然後我們可以通過filter-mapping映射過濾器和url,此處使用了兩個映射,對該過濾器指定了對路徑名為/a和/b的請求進行攔截。當然這個url-pattern元素的值可以有以下三種形式,完全匹配(/a/b等),目錄匹配(/* 、 /abc/等),擴展名(.a,*.b等)。
    了解了配置filter的主要操作之後,我們回去看過濾器類,我們說init方法是在首次創建filter實例的時候,用於執行初始化操作的,其中有個參數filterconfig ,這是當前filter的配置信息,其中方法如下:

  • string getfiltername();servletcontext getservletcontext();string getinitparameter(string var1);enumeration getinitparameternames();

  • 其實在創建filter實例的時候,web容器會將此實例對應在web.xml中的配置信息讀取並封裝成一個filterconfig 對象傳遞給init方法,getfiltername方法就是我們在web.xml中配置的filter-name,getservletcontext會獲取當前servlet的上下文,當我們在定義filter的時候使用來定義一些初始化參數的時候,就可以使用此方法來獲取這些初始化參數。getinitparameternames方法用於獲取所有初始化參數的枚舉集合。這樣我們在init方法中就可以獲取這些配置參數,初始化filter實例。
    上面我們只定義了一個filter,如果我們對於一次請求需要執行多個filter,進行過濾操作的話,web容器會在你請求某個url的時候,在web.xml中找到所有匹配的filter,按照注冊的順序以filterchain 鏈的形式傳遞到方法dofilter的第三個參數中,而這個filterchain中只有一個方法:

  • void dofilter(servletrequest var1, servletresponse var2)

  • 如果我們在 void dofilter(servletrequest var1, servletresponse var2, filterchain var3) 方法中調用var3.dofilter(var1,var2),就代表此filter實例結束,則web伺服器會檢查filterchain對象中是否還有filter對象(因為這是一個鏈,filter的數量是大於等於一的),如果沒有就會放行,直接調用目標地址,如果還有filter對象,就會轉而執行下一個filter。正是由於這樣的機制,我們才可以對於一個url請求添加多個filter過濾器。

    三、一個簡單的實例
    下面通過一個簡單的實例直觀的感受下filter過濾器的作用:

  • public class myfilter implements filter { @override

  • public void dofilter(servletrequest var1, servletresponse var2, filterchain var3) throws ioexception, servletexception{


  • httpservletrequest req = (httpservletrequest)var1;

  • httpsession session = req.getsession();

  • string state = (string)session.getattribute("state"); if(state.equals("1")){

  • var3.dofilter(var1,var2);

  • }else{

  • httpservletresponse response = (httpservletresponse)var2;

  • response.sendredirect("error_page.html");

  • }

  • }

  • }

  • //web.xml

  • islogin

  • test_f.myfilter





  • islogin

  • /index.jsp


  • <%@ page contenttype="text/html;charset=utf-8" language="java" %>







  • //set.jsp//為了使程序簡單,我們採用手動設置session//在實際的項目中,當用戶登錄之後自動設置session<%@ page contenttype="text/html;charset=utf-8" language="java" %>





  • <%pagecontext.getsession().setattribute("state","0");%>


  • 我們首先訪問set.jsp頁面設置本次會話的session值,然後修改瀏覽器地址欄訪問index.jsp頁面

    上述的demo只是為了簡單的演示,其實使用filter可以完成大大的降低我們的代碼的冗餘程度。這個例子是為了演示,所以很簡單。

    四、filter 的生命周期
    當用戶請求某個頁面時候,會到web.xml中匹配是否存在能夠匹配上此次請求的filter,如果有封裝它的配置信息,filterchain鏈。然後調用init方法,完成初始化,接著調用dofilter方法,處理核心邏輯,當此實例被銷毀的時候,會調用destroy方法。

熱點內容
resin下jsp不能正常編譯 發布:2024-07-17 16:34:44 瀏覽:229
sqlserver如何切換主備伺服器 發布:2024-07-17 16:23:02 瀏覽:299
mc18伺服器ip 發布:2024-07-17 16:23:02 瀏覽:379
仙境傳說手游腳本 發布:2024-07-17 16:09:24 瀏覽:691
matlab命令窗口和新建腳本 發布:2024-07-17 15:51:26 瀏覽:375
建ftp文件夾 發布:2024-07-17 15:51:26 瀏覽:955
魔獸撿物腳本 發布:2024-07-17 15:27:56 瀏覽:130
開發ip伺服器 發布:2024-07-17 15:24:42 瀏覽:388
安卓系統視頻製作哪個好用 發布:2024-07-17 15:10:47 瀏覽:210
androidapk結構 發布:2024-07-17 15:10:43 瀏覽:945
网站地图