❶ 編寫servlet過濾器,下面哪個介面用於調用過濾器鏈中下一個過濾器
一個filter必須實現javax。servlet。Filter介面定義的三...個過濾器的過濾條件時該請求就會交給這個過濾器
❷ 過濾器使用哪個方法才能繼續傳遞到下一個過濾器
最省事的方法就是用新型的魚池過濾,不僅如此,新型的魚池過濾系統還能快速反沖洗,將過濾器的臟物沖洗干凈。安裝簡單,佔地空間小,成本低了,並且後期維護方便。西普魚池過濾就不錯,整合了物理和生化雙重過濾,將過濾干凈重新流回泳池,使魚池水變澄清。
❸ java web 過濾器跟攔截器的區別和使用
區別如下:
1 、攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2 、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3 、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4 、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5 、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
使用如下:
在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交「修改的注冊信息」的網頁,當用戶填寫完修改信息並提交後,伺服器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。
這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功後,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。
(3)過濾器使用才能繼續傳遞到下一個過濾器擴展閱讀:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。
❹ 請問:如何在java過濾器更改url請求地址,然後交給下一個過濾器處理
更改地址?除非你在這個filter里重定向,第二次直接放行,到第二個filter
❺ 編寫servlet過濾器時,哪個介面用於調用過濾器鏈中下一個過濾器
void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)這個方法有3個參數,調用過濾器鏈中內的下一個容過濾器用的是第三個參數
filterChain.doFilter(request, response);
❻ java連個過濾器之間的跳轉
你就想定義一個filter一樣定義兩個filter就可以。在filter中不是有一個filterchain么,他就是把請求傳遞給下一個filter去處理的。
❼ 編寫servlet過濾器是,哪個介面用於調用過濾器鏈中下一個過濾器
1、首先要明確攔截器、濾器
1.1 攔截器:
攔截器AOP(Aspect-Oriented Programming)用於某或欄位訪問前進行攔截前或加入某些操作攔截AOP種實現策略
Webwork文文檔解釋——攔截器態攔截Action調用象提供種機制使發者定義action執行前執行代碼action執行前阻止其執行同提供種提取action重用部式
談攔截器詞家應該知道——攔截器鏈(Interceptor ChainStruts 2稱攔截器棧 Interceptor Stack)攔截器鏈攔截器按定順序聯結條鏈訪問攔截或欄位攔截器鏈攔截器按其前定義順序調用
1.2. 攔截器實現原理:
部候攔截器都通代理式調用Struts 2攔截器實現相簡單請求達Struts 2ServletDispatcherStruts 2查找配置文件並根據其配置實例化相攔截器象串列表(list)調用列表攔截器
1.3 濾器
濾器程序先於與相關servlet或JSP頁面運行伺服器濾器附加或servlet或JSP頁面並且檢查進入些資源請求信息濾器作選擇:
①規式調用資源(即調用servlet或JSP頁面)
②利用修改請求信息調用資源
③調用資源發送響應客戶機前其進行修改
④阻止該資源調用代轉其資源返特定狀態代碼或替換輸
1.4 Servlet濾器基本原理
Servlet作濾器使用客戶請求進行處理處理完交給濾器處理客戶請求濾鏈逐處理直請求發送目標止例某網站提交修改注冊信息網頁用戶填寫完修改信息並提交伺服器進行處理需要做兩項工作:判斷客戶端否效;提交數據進行統編碼兩項工作由兩濾器組濾鏈進行處理濾器處理功提交數據發送終目標;濾器處理功視圖派發指定錯誤頁面
-
❽ 關於Servlet過濾器的問題
相同,1,如果沒有過濾器的話,會跳轉到過濾器處理後的request請求的頁面,專如果你用的是request跳轉頁面,就屬相同,如果用response那麼就是重定向,他們的request和response就不相同,
2.chain.doFilter(request,response)之後的代碼是在你過濾器放行之後,把你當前的請求執行完過後才執行的,比如說:用戶發送一個請求到你的伺服器,被你的過濾器攔截下來了,並且過濾通過以後,那麼它會完成當前請求所需要的操作。當請求完成的時候,伺服器要響應給客戶端的時候,它就會執行你chain.doFilter(request,response)之後的代碼
❾ 如何開發傳輸過濾器
在開發自己的 filter 之前,看看 DMO(DirectX Media Object)是否滿足你的要求,因為 DMO 可以做許多和 filter
相同的工作,但是開發 DMO 比開發 filter 要簡單多了。開發 transform filter 主要有下面的幾個步驟,努力的遵循
吧
第一步選擇一個基類
下面的基類適合開發 transform filter。
CTransformFilter 就是為了 transform filter 而設計的基類,這個類中有分開的輸入和輸出 buffers,這種類型的
filter 有時也稱作 -transform filter,當一個 -transform filter 接收到一個輸入 samples 的時候,它就
將 sample 寫入到一塊新的輸出 buffer 中,然後將這個新的 buffer 傳遞給下一個 filter。
CTransInPlaceFilter,這個類型的 filter 在原來的 buffer 里修改 data,也叫 trans-in-place filters.
當這種類型的 filter 接收到一個 sample,它改變這個 sample 中的數據,然後將 sample 傳遞下去,這種類型的輸入
pin 和輸出 pin 總是按照某個媒體類型連接起來。
CVideoTransformFilter 這個類型的 filter 僅僅是為了視頻解碼器設計的。從 CTransFormFilter 派生而來,但是這
個 filter 可以根據下游的 render 自動的丟棄 data。
CBaseFilter 是個總基類,所有的 filter 都是從這個類派生出去的。如果上面的 filter 都不適合你,那麼你只有自
己從這個基類中派生了。
第二步聲明自己的 Filter 類
首先聲明一個從基類派生的 c++類
class CRleFilter : public CTransformFilter
{
/* Declarations will go here. */
};
每個 filter 類都需要連接的 pin 類。根據你的需要,你要派生和你的 filter 連接的 pin 類。
你還要給你的 filter 設置一個不能重復的 CLSID,你可以利用 Guidgen or Uuidgen 來產生一個 128 位 CLSID,切忌
不要拷貝其它的 filter 的。有很多種方法來聲明 CLSID,下面的例子使用了 DEFINE_GUID 宏。
[RleFilt.h]
// {1915C5C7-02AA-415f-890F-76D94C85AAF1}
DEFINE_GUID(CLSID_RLEFilter,
0x1915c5c7, 0x2aa, 0x415f, 0x89, 0xf, 0x76, 0xd9, 0x4c, 0x85, 0xaa, 0xf1);
[RleFilt.cpp]
#include
#include "RleFilt.h"
然後,給你的 filter 寫一個構造函數
CRleFilter::CRleFilter()
: CTransformFilter(NAME("My RLE Encoder"), 0, CLSID_RLEFilter)
{
/* Initialize any private variables here. */
}
注意,構造函數中有個參數就是我前面定義的 CLSID。
第三步 支持媒體類戲協議
當兩個 pin 連接的時候,他們必須就某種媒體類型達成一致協議,否則連接失敗,數據媒體類型描述了數據的格式,
如果沒有媒體類型,一個 filter 可能傳遞一種類型的數據,然後其它的 filte 卻不能識別這種數據。
Pin 連接的時候達成協議的機制主要通過 IPin::ReceiveConnection 方法來實現的。輸出 pin 用某種媒體類型作參數
調用輸入 pin 上的這個方法,輸入 pin 要麼接受,要麼拒絕。如果輸入 pin 拒絕連接,那麼輸出 pin 更改一下媒體類
型繼續連接,直至所有的媒體類型都連接一遍,如果沒有找到合適的媒體的類型,那麼連接失敗。
在輸入 pin 也可以通過 IPin::EnumMediaTypes 方法來任意的枚舉它所支持的媒體類型 list。輸出 pin 可以通過這個
list 也可以檢查是否支持某種媒體類型。
CTransformFilter 實現一個通用的框架。如下
1 輸入 pin 沒有首選的媒體類型,這個主要看上游的 filter 提議的媒體類型。對於視頻數據,媒體類型包括圖片的
大小,和楨率,這個信息必須由上游的源 filter 或者 parser filter 提供。對於音頻數據,設置的數據格式就小了
許多,因此,要重載輸入 pin 的 CBasePin::GetMediaType
2 當上游的 filter 提議一個媒體類型進行連接的時候,輸入 pin 就調用
CTransformFilter::CheckInputType 方法,這個方法拒絕和接受媒體類型。
3 只有輸入 pin 連接以後,輸出 pin 才能夠連接,這個是屬於 transform filter 的一個特性。大多數情況下,filter
在設置輸出 pin 的 type 之前一定要設置好輸入 pin 的類型
4 當輸出 pin 沒有連接的時候,它向下游 filter 連接的時候,要枚舉本 filter 支持的媒體類型,形成一個 list,他
通過調用 CTransformFilter::GetMediaType 方法來產生這個 list,輸出 pin 會就下游 filter 所支持的所有的媒體類
型進行連接
5 為了檢測輸入 pin 是否支持某個特定的輸出媒體類型,輸出 pin 通過調用 CTransformFilter::CheckTransform 方
法。
上面列出的三個 CTransformFilter 方法都是純虛函數,因此你的 filter 必須實現這三個函數
當上游的 filter 連接的時候提議一個媒體類型,那麼輸入 pin 就會調用函數
virtual HRESULT CheckInputType(const CMediaType* mtIn) pure;
這個函數包含了一個 CMediaType 類型的對象指針,這個類型封裝了一個 AM_MEDIA_TYPE 結構。在這個函數中,你要
檢查 AM_MEDIA_TYPE 結構的中相關的 field,如果該結構中有任何 fied 不合法,就返回 VFW_E_TYPE_NOT_ACCEPTED,
如果所有的媒體類型都是正確的,返還 S_OK
,例如,在 RLE 編碼 filter,輸入類型必須是 8 位或者 4 位的沒有壓縮的 RGB 視頻。沒有必要支持其它的輸入格式,
例如 16,24 位,因為那樣,filter 還得進行轉換。下面的例子假定 filter 只支持 8 位的視頻,不支持 4 位的視頻
HRESULT CRleFilter::CheckInputType(const CMediaType *mtIn)
{
if ((mtIn->majortype != MEDIATYPE_Video) ||
(mtIn->subtype != MEDIASUBTYPE_RGB8) ||
(mtIn->formattype != FORMAT_VideoInfo) ||
(mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFOHEADER *pVih =
reinterpret_cast(mtIn->pbFormat);
if ((pVih->bmiHeader.biBitCount != 8) ||
(pVih->bmiHeader.biCompression != BI_RGB))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Check the palette table.
if (pVih->bmiHeader.biClrUsed > PALETTE_ENTRIES(pVih))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
DWORD cbPalette = pVih->bmiHeader.biClrUsed * sizeof(RGBQUAD);
if (mtIn->cbFormat < sizeof(VIDEOINFOHEADER) + cbPalette)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Everything is good.
return S_OK;
}
在這個例子中,函數首先檢查 major type and subtype,然後檢查格式類型,為了確保 block 格式是一個
VIDEOINFOHEADER 結構,這個 filter 也要支持 VIDEOINFOHEADER2,
如果格式類型是正確的,這個 sample 還得檢查 VIDEOINFOHEADER 結構的 biBitCount and biCompression members,
2 virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType) PURE;
CTransformFilter::GetMediaType 根據序號 iPositiong 返回一個 fiter 支持的輸出類型。只有輸入 pin 被連接上以
後,這個方法才會被調用,因此,你可以利用上游 filter 支持的媒體類型來決定下游輸出的媒體類型
下面的例子返回一個輸出媒體類型,這個輸出是根據輸入類型修改的
HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
ASSERT(m_pInput->IsConnected());
if (iPosition < 0)
{
return E_INVALIDARG;
}
if (iPosition == 0)
{
HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
if (FAILED(hr))
{
return hr;
}
FOURCCMap fccMap = FCC('MRLE');
pMediaType->subtype = static_cast(fccMap);
pMediaType->SetVariableSize();
pMediaType->SetTemporalCompression(FALSE);
ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
VIDEOINFOHEADER *pVih =
reinterpret_cast(pMediaType->pbFormat);
pVih->bmiHeader.biCompression = BI_RLE8;
pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader);
return S_OK;
}
// else
return VFW_S_NO_MORE_ITEMS;
}
這個例子函數中,調用了 IPin::ConnectionMediaType 從輸入 pin 上得到輸入的媒體類型。然後改變了媒體類型結構
的幾個 filed,表示是壓縮格式
1 It assigns a new subtype GUID, which is constructed from the FOURCC code 'MRLE', using the FOURCCMap
class.
2 It calls the CMediaType::SetVariableSize method, which sets the bFixedSizeSamples flag to FALSE and the
lSampleSize member to zero, indicating variable-sized samples.
3 It calls the CMediaType::SetTemporalCompression method with the value FALSE, indicating that every frame
is a key frame. (This field is informational only, so you could safely ignore it.)
4 It sets the biCompression field to BI_RLE8.
5 It sets the biSizeImage field to the image size.
3 virtual HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut) PURE;
CTransformFilter::CheckTransform 檢查輸出的媒體類型和輸入的媒體類型是否匹配。當輸入 pin 在輸出 pin 連接之
後才開始連接的時候,輸出 pin 會調用這個函數來檢查輸出媒體類型是否和輸入媒體類型是否匹配。
下面的例子演示了查詢數據的格式是否為 RLE8 視頻,圖像的大小是否和輸入的匹配,調色板的入口是否一致,如果
圖像大小不一致就要拒絕
HRESULT CRleFilter::CheckTransform(
const CMediaType *mtIn, const CMediaType *mtOut)
{
// Check the major type.
if (mtOut->majortype != MED