Filter

Filter可以擔任瀏覽器與JSP/Servlet之間的一個中介處理者,一些request的前置處理動作及一些response的後置處理,都可以交由這個中介處理者來完成,當然Filter可以達到的功能,您也可以直接撰寫在JSP/Servlet中,但如果有很多JSP/Servlet都需要相同的處理,例如某些網頁都需要統一的身份驗證方式時,與其在每一個網頁中都撰寫驗證的程式碼,不如直接撰寫Filter,讓它來統一進行處理

Filter實際上是一個純綷的Java類別程式,它要實作javax.servlet.Filter介面,這個介面中有三個必須實作的方法:init()、destory()與doFilter()。init()是Filter類別被載入時會執行的方法,而destory()是 Filter物件生命週期結束時會執行的方,至於doFilter()則是實作Filter功能的核心,您想要Filter完成的工作就撰寫在其中,先來撰寫一個簡單的Filter類,如下:
  • FilterDemo1.java
package onlyfun.caterpillar;

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

public class FilterDemo1 implements Filter {
public void init(FilterConfig config)
throws ServletException {
}

public void destroy() {
}

public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("Filter 1 is doing!!!");

chain.doFilter(request, response);

out.println("Filter 1's work is done");
}
}

在這個程式中,只是簡單的顯示一些文字,表示Filter的doFilter()方法有被執行,doFilter()傳入三個參數, ServletRequest、ServletResponse、FilterChain,您可以獲得request與response物件,以對它們進行一些處理,像是設定標頭、編碼格式或包裝壓縮功能等等,至於FilterChain則是關於Filter執行順序的物件,這個順序是設定在 web.xml中,您必須呼叫它的doFilter()方法,才可以執行下一個Filter,如果是最後一個Filter,則執行客戶端所請求的 JSP/Servlet網頁。

為了要能使用Filter,您必須在web.xml中撰寫一些設定,一個設定範例如下:

  • web.xml
...
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>onlyfun.caterpillar.FilterDemo1</filter-class>
</filter>

<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...

<filter>與</filter>之間撰寫Filter的名稱與實際載入的類別,Filter類別檔是放置在WEB- INF/classes/下,而<filter-mapping>與</filter- mapping>之間則撰寫Filter名稱與所要過濾的資源對象,在這邊設定為/*,表示請求這個Web應用程式下的所有資源,都要先經過 Filter的處理。

如果設定的<url-pattern>套用了兩個Filter,則FilterChain在執行doFilter()方法時,其呼叫的 Filter順序就是您在web.xml中撰寫Filter的順序,例如再撰寫一個Filter程式:

  • FilterDemo2.java
package onlyfun.caterpillar;

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

public class FilterDemo2 implements Filter {
public void init(FilterConfig config)
throws ServletException {
}

public void destroy() {
}

public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("Filter 2 is doing!!!");

chain.doFilter(request, response);

out.println("Filter 2's work is done");
}
}

web.xml中設定的內容是:
  • web.xml
... 
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>onlyfun.caterpillar.FilterDemo1</filter-class>
</filter>

<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>FilterDemo2</filter-name>
<filter-class>onlyfun.caterpillar.FilterDemo2</filter-class>
</filter>

<filter-mapping>
<filter-name>FilterDemo2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...

則請求Web應用程式下的任一個資源,都會先執行FilterDemo1,然後再執行FilterDemo2,最後呼叫請求的資源,如果請求的資源是 JSP網頁,而它的功能只是印出 5 個Hello! World!:
  • test.jsp
<% 
for(int i = 0; i < 5; i++)
out.println("Hello! World!");
%>


則呼叫該JSP網頁時,所得到的結果是:

在實作Filter介面時必須實作init()方法,該方法傳入一個FilterConfig物件作為參數,它包括了一些容器傳遞給Filter,有關於Filter的相關設定資訊,您可以透過下面幾個方法來取得這些資訊:

public java.lang.String getFilterName()
public java.lang.String getInitParameter(java.lang.String name)
public java.util.Enumeration getInitParameterNames()
public ServletContext getServletContext()

其中getInitParameter()與getInitParameterNames()資訊的取得來源,即web.xml中設定的參數訊息,使用方法與之前設定Servlet時相同,一個例子如下:

  • web.xml
...
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>onlyfun.caterpillar.SomeFilter</filter-class>
<init-param>
<param-name>parameter1</param-name>
<param-value>paramValue</param-value>
</init-param>
</filter>
...


在Servlet 2.3之前,Filter的觸發只能透過使用者的直接請求,而在Servlet 2.4之後,您可以透過幾個可能的轉發或包括等方式來觸發Filter,這可以在web.xml中加以設定,觸發Filter的方式有FORWARD、 INCLUDE、REQUEST與ERROR,即轉發、包含、請求與錯誤網頁請求時,預設的觸發方式是REQUEST,您可以使用< dispatcher>標籤來加以設定,例如:

  • web.xml
...
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<url-pattern>/somePage.jsp</url-mapping>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
...


除了在doFilter()中撰寫簡單的過濾功能、添加request或response的資訊之外,您也許還會想要直接的加強request與 response的處理方式,例如增加對請求資源的壓縮功能,這種在原來的request與response功能之上,再添加額外的處理功能,可以採用 Decorator 模式,在Servlet 2.4之後,提供了實作裝飾模式的Wrapper類別:ServletRequestWrapper、ServletResponseWrapper、 HttpServletRequestWrapper、HttpServletResponseWrapper,前兩者分別實作了 ServletRequest與ServletResponse,後兩者則分別又繼承了前兩者,您可以繼承這些類別,以裝飾模式來添加request與 response的額外處理能力。

Filter 1 is doing!!!
Filter 2 is doing!!!
Hello! World!
Hello! World!
Hello! World!
Hello! World!
Hello! World!
Filter 2's work is done
Filter 1's work is done 
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值