java過濾器簡單實例,java過濾器簡單實例分析

本文目錄一覽:

舉一個好例子說明java中什麼情況下用過濾器,什麼時候用攔截器,什麼時候用偵聽(沒分了,但想知道真相)

過濾器Filter:過濾器一般是用責任鏈來實現的,一般我們需要處理過濾的參數的時候來用,比如我們在使用Struts2的時候,需要過濾*.do的請求,我們可以使用過濾器,DispatchFilter處理完之後交給下一個過濾器使用就可以了;

攔截器Interceptor:當我們有一個方法需要在執行之前或之後對其進行攔截,比如:

void test() {

//前面我們需要加身份認證

 System.out.println(“你好”);

//認證完之後我們需要打印處理成功

}

監聽Listner:這個主要應用於事件監聽,比如我現在要處理一個按鈕,當點擊這個按鈕的時候,會觸發一個Click事件,這個就是監聽

java項目和web項目中的過濾器文件怎麼使用?

過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。在這之後,過濾器可以作如下的選擇:

1. 以常規的方式調用資源(即,調用servlet或JSP頁面)。

2.利用修改過的請求信息調用資源。

3. 調用資源,但在發送響應到客戶機前對其進行修改

4. 阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。

1. 建立基本過濾器

建立一個過濾器涉及下列五個步驟:

1)建立一個實現Filter接口的類。這個類需要三個方法,分別是:doFilter、init和destroy。

doFilter方法包含主要的過濾代碼(見第2步),init方法建立設置操作,而destroy方法進行清楚。

2)在doFilter方法中放入過濾行為。doFilter方法的第一個參數為ServletRequest對象。此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問。第二個參數為ServletResponse,通常在簡單的過濾器中忽略此參數。最後一個參數為FilterChain,如下一步所述,此參數用來調用servlet或JSP頁。

3)調用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象作為它的一個參數。在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。

4)對相應的servlet和JSP頁面註冊過濾器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。

5)禁用激活器servlet。防止用戶利用缺省servlet URL繞過過濾器設置。

1.1 建立一個實現Filter接口的類

所有過濾器都必須實現javax.servlet.Filter。這個接口包含三個方法,分別為doFilter、init和destroy。

public void doFilter(ServletRequset request,

ServletResponse response,

FilterChain chain)

thows ServletException, IOException

每當調用一個過濾器(即,每次請求與此過濾器相關的servlet或JSP頁面)時,就執行其doFilter方法。正是這個方法包含了大部分過濾邏輯。第一個參數為與傳入請求有關的ServletRequest。對於簡單的過濾器,大多數過濾邏輯是基於這個對象的。如果處理HTTP請求,並且需要訪問諸如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此對象構造成HttpServletRequest。

第二個參數為ServletResponse。除了在兩個情形下要使用它以外,通常忽略這個參數。首先,如果希望完全阻塞對相關servlet或JSP頁面的訪問。可調用response.getWriter並直接發送一個響應到客戶機。其次,如果希望修改相關的servlet或JSP頁面的輸出,可把響應包含在一個收集所有發送到它的輸出的對象中。然後,在調用serlvet或JSP頁面後,過濾器可檢查輸出,如果合適就修改它,之後發送到客戶機。

DoFilter的最後一個參數為FilterChain對象。對此對象調用doFilter以激活與servlet或JSP頁面相關的下一個過濾器。如果沒有另一個相關的過濾器,則對doFilter的調用激活servlet或JSP本身。

public void init(FilterConfig config) thows ServletException

init方法只在此過濾器第一次初始化時執行,不是每次調用過濾器都執行它。對於簡單的過濾器,可提供此方法的一個空體,但有兩個原因需要使用init。首先,FilterConfig對象提供對servlet環境及web.xml文件中指派的過濾器名的訪問。因此,普遍的辦法是利用init將FilterConfig對象存放在一個字段中,以便doFilter方法能夠訪問servlet環境或過濾器名.其次,FilterConfig對象具有一個getInitParameter方法,它能夠訪問部署描述符文件(web.xml)中分配的過濾器初始化參數。

public void destroy( )

大多數過濾器簡單地為此方法提供一個空體,不過,可利用它來完成諸如關閉過濾器使用的文件或數據庫連接池等清除任務。

1.2 將過濾行為放入doFilter方法

doFilter方法為大多數過濾器地關鍵部分。每當調用一個過濾器時,都要執行doFilter。對於大多數過濾器來說,doFilter執行的步驟是基於傳入的信息的。因此,可能要利用作為doFilter的第一個參數提供的ServletRequest。這個對象常常構造為HttpServletRequest類型,以提供對該類的更特殊方法的訪問。

1.3 調用FilterChain對象的doFilter方法

Filter接口的doFilter方法以一個FilterChain對象作為它的第三個參數。在調用該對象的doFilter方法時,激活下一個相關的過濾器。這個過程一般持續到鏈中最後一個過濾器為止。在最後一個過濾器調用其FilterChain對象的doFilter方法時,激活servlet或頁面自身。

但是,鏈中的任意過濾器都可以通過不調用其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再調用JSP頁面的serlvet,並且中斷此調用過程的過濾器負責將輸出提供給客戶機。

1.4 對適當的servlet和JSP頁面註冊過濾器

部署描述符文件的2.3版本引入了兩個用於過濾器的元素,分別是:filter和filter-mapping。filter元素向系統註冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。

下面是一個完整的例子:

//建立一個實現Filter接口的類。這個類需要三個方法,分別是:doFilter、init和destroy。

//doFilter方法包含主要的過濾代碼,init方法建立設置操作,而destroy方法進行清

package filterpkg;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

public class testFilter implements Filter{

public void init(FilterConfig filterConfig) throws ServletException

{

}

//在doFilter方法中放入過濾行為。doFilter方法的第一個參數為ServletRequest對象。

//此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問。

//第二個參數為ServletResponse,通常在簡單的過濾器中忽略此參數。

//最後一個參數為FilterChain,如下一步所述,此參數用來調用servlet或JSP頁。

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain filterChain)

{

PrintWriter wout=null;

try

{

wout=response.getWriter();

}

catch(IOException e)

{

}

HttpServletRequest req=(HttpServletRequest)request;//將request轉化為它的子類HttpServletRequest

String uri=req.getRequestURI();//獲得傳入的URI

if (uri.indexOf(“MyJsp.jsp”)0 ||uri.indexOf(“MainForm.do”)0 )//如果是我們指定的登錄頁面或驗證頁面

{

try

{

//調用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象作為它的一個參數。

//在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。

filterChain.doFilter(request, response);

}

catch(Exception e)

{

}

return;

}

if (req.getSession()!=null)

if (req.getSession().getAttribute(“USERID”)==null)

{

wout.write(“HTMLBODY Check error! br/ /BODY /HTML”);

wout.flush();

return;

}

try

{

filterChain.doFilter(request, response);

}

catch(Exception e)

{

}

}

public void destroy()

{

}

}

web.xml

?xml version=”1.0″ encoding=”UTF-8″?

web-app version=”2.4″

xmlns=””

xmlns:xsi=””

xsi:schemaLocation=”

filter

filter-nameCHECKCODE/filter-name

filter-classfilterpkg.testFilter/filter-class

/filter

filter-mapping

filter-nameCHECKCODE/filter-name

url-pattern/*/url-pattern

/filter-mapping

servlet

descriptionThis is the description of my J2EE component/description

display-nameThis is the display name of my J2EE component/display-name

servlet-nameControlServlet/servlet-name

servlet-classfilterpkg.ControlServlet/servlet-class

/servlet

servlet-mapping

servlet-nameControlServlet/servlet-name

url-pattern*.do/url-pattern

/servlet-mapping

/web-app

java如何創建過濾器

弄過濾器,要實現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;

import javax.servlet.http.HttpServletResponse;

public class EncodingFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

request.setCharacterEncoding(“GBK”);//處理編碼

response.setCharacterEncoding(“GBK”);//處理編碼

chain.doFilter(request, response);//讓過濾器執行下一個請求

}

public void destroy() {}

public void init(FilterConfig arg0) throws ServletException {}

}

//下面這個是在web.xml下的配置

filter

filter-nameencoding/filter-name

filter-class

剛剛創建的那個實現filter接口的類的位置

例如:com.temp.filter.EncodingFilter

/filter-class

/filter

filter-mapping

filter-nameencoding/filter-name

url-pattern*.jsp這個是以jsp為後綴的文件都攔截下來/url-pattern

/filter-mapping

可以寫多個的filter-mapping來配置你所要攔截的東西

恩,有點嘮叨,希望可以幫助到你

java 文件過濾器怎麼實現。??

import java.io.File;

import java.io.FilenameFilter;

/**

* 文件過濾器的簡單實現

*

* @author ajaxfan

* @date 2010-04-17

*/

public class FileNameFilterDemo {

public static void main(String[] args) {

list(“d:/”);

}

/**

* 列出特定路徑下的txt文件

*

* @param directoryName

* 路徑名

*/

private static void list(String directoryName) {

File dir = new File(directoryName);

// 確定該路徑指向一個目錄

if (dir.exists() dir.isDirectory()) {

// 列出所有結尾為txt的文件

File[] files = dir.listFiles(new FilenameFilter() {

@Override

public boolean accept(File dir, String name) {

return name.endsWith(“txt”);

}

});

System.out.println(java.util.Arrays.toString(files));

}

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/270760.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:38
下一篇 2024-12-16 13:38

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29

發表回復

登錄後才能評論