国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Java EE中Filter技術(shù)的研究與應(yīng)用

2018-11-01 05:19:12姚添譯楊廷發(fā)蘭全祥
電腦知識與技術(shù) 2018年18期
關(guān)鍵詞:開發(fā)技術(shù)過濾器

姚添譯 楊廷發(fā) 蘭全祥

摘要:過濾器能夠?qū)φ埱笮畔⒑晚憫?yīng)信息進(jìn)行處理,在Java Web開發(fā)中具有重要的作用和地位。通過對過濾器的概念、方法、配置及執(zhí)行過程進(jìn)行分析,闡述了過濾器的特性,并對過濾器在Java EE中的應(yīng)用進(jìn)行了研究。從項(xiàng)目開發(fā)入手,探討了過濾器在編碼過濾、緩存控制、登錄驗(yàn)證、流量統(tǒng)計(jì)、敏感字過濾、讀取cookie等方面的應(yīng)用。過濾器的出現(xiàn)極大地減少了開發(fā)人員的工作量,有利于網(wǎng)站的開發(fā)與維護(hù)。

關(guān)鍵詞:Java EE;過濾器;開發(fā)技術(shù);網(wǎng)站開發(fā)

中圖分類號:TP311.1 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)18-0047-04

Research and Application of Filter Technology on Java EE

YAO Tian-yi, YANG Ting-fa, LAN Quan-xiang

(Panzhihua University, Panzhihua 617000, China)

Abstract: Filters can process request or response information, and play an important role in Java Web development. Through analyzing the concept, method, configuration and execution process of the filter, it describe the characteristics of the filter. A study is made of the application of filter. At the core of project development, it discusses applications of filters in processing coding, controlling caching, validating permissions, counting site access, shielding sensitive words, reading cookie and so on. The filter can greatly reduce the workload of development and maintenance.

Key words: Java EE; filter; development technology; website development

1 背景

Servlet是運(yùn)行在服務(wù)器上的小程序,它作為來自瀏覽器(或客戶端)的請求與服務(wù)器(或應(yīng)用程序)的中間層,為Web開發(fā)者提供了一種簡便可靠的機(jī)制來擴(kuò)展web服務(wù)器的功能[1]。在實(shí)際的網(wǎng)站開發(fā)中需要處理大量的請求與響應(yīng)信息,并且大多數(shù)時(shí)候需要在訪問Servlet之前對請求進(jìn)行處理,判斷是否有訪問權(quán)限。在過濾器出現(xiàn)之前,若想實(shí)現(xiàn)上述功能,則需要為Servlet編寫一個(gè)父類。但如果存在多個(gè)處理需求,則需要為Servlet實(shí)現(xiàn)多個(gè)父類,這給開發(fā)人員造成了很多不便。

為解決這一問題sun公司在Servlet 2.3規(guī)范中新增了Filter技術(shù),F(xiàn)ilter是一個(gè)繼承了javax.servlet.Filter 接口的Java類,能動(dòng)態(tài)地?cái)r截請求和響應(yīng)并對request、response進(jìn)行處理,同時(shí)可以決定是否允許訪問目標(biāo)資源。因此,F(xiàn)ilter可運(yùn)用在編碼過濾、緩存控制、登錄驗(yàn)證、流量統(tǒng)計(jì)、敏感字過濾、讀取cookie等方面,它的出現(xiàn)極大地簡化了網(wǎng)站的開發(fā)與部署。

2 Filter簡介

2.1 概述

過濾器是Java EE核心編程中的一個(gè)重要部分,它實(shí)質(zhì)上就是一個(gè)位于服務(wù)器上的Web應(yīng)用組件,用于動(dòng)態(tài)地?cái)r截請求和響應(yīng)以及決定目標(biāo)資源是否能被訪問。過濾器的出現(xiàn)更便于查看、提取或以某種方式操作客戶端和服務(wù)器之間交換的數(shù)據(jù)[2],其處理方式如圖1所示。

當(dāng)一個(gè)過濾器不能滿足實(shí)際業(yè)務(wù)需要時(shí),則需部署多個(gè)過濾器對業(yè)務(wù)請求進(jìn)行處理,此時(shí)多個(gè)過濾器就組成了過濾鏈,過濾器鏈如圖2所示。

客戶端發(fā)出的請求會(huì)依次通過過濾鏈上的所有過濾器,直到傳遞給最后一個(gè)為止,再將請求交給目標(biāo)資源進(jìn)行處理。目標(biāo)資源在處理完請求后,響應(yīng)信息再從最后一個(gè)過濾器傳遞給第一個(gè)過濾器,最后傳送到客戶端[3]。只有當(dāng)請求的目標(biāo)資源路徑被包含在過濾路徑(編寫過濾器時(shí)需配置過濾路徑)中時(shí),過濾器才會(huì)對請求進(jìn)行處理。

2.2 Filter API

過濾器是一個(gè)實(shí)現(xiàn)了javax.servlet.Filter接口的java類,在Filter接口中定義了三個(gè)方法,分別為init()方法、doFilter()方法和destroy()方法。

1)初始化方法init()

init()方法在servlet容器創(chuàng)建servlet Filter實(shí)例后就會(huì)調(diào)用該方法,并且在過濾器的整個(gè)生命周期中只執(zhí)行1次。

該方法無返回值,形參列表包含1個(gè)javax.servlet.FilterConfig類型的參數(shù),該參數(shù)通過getInitParameter()和getServletContext()方法來讀取web.xml文件中Servlet過濾器的初始化參數(shù)。

2)對請求進(jìn)行處理doFilter()

每當(dāng)請求或響應(yīng)通過過濾器時(shí),容器都會(huì)調(diào)用Filter中的doFilter方法,該方法在過濾器的生命周期中可執(zhí)行多次。當(dāng)Filter攔截到請求后,會(huì)先執(zhí)行chain.doFilter()之前的代碼,然后執(zhí)行下一個(gè)Filter或者訪問目標(biāo)資源,最后再執(zhí)行chain.doFilter()后的代碼。

該方法無返回值,形參列表包含1個(gè)javax.servlet. ServletRequest類型的參數(shù)(請求),1個(gè)javax.servlet. ServletServletResponse類型的參數(shù)(響應(yīng)),1個(gè)javax.servlet.FilterChain類型的參數(shù)(過濾鏈)。在此方法中可以將請求傳遞給下一個(gè)過濾器(或目標(biāo)資源),也可以在此終止請求。

3)銷毀方法destroy()

destroy()方法由Web容器調(diào)用,調(diào)用之后將釋放所有被過濾器占用的資源。該方法在過濾器的生命周期中只執(zhí)行1次。

3 過濾器的創(chuàng)建與配置

3.1 過濾器的創(chuàng)建

過濾器的創(chuàng)建有兩種方法:一是直接創(chuàng)建一個(gè)實(shí)現(xiàn)了javax.servlet.Filter接口的類;二是使用java集成開發(fā)環(huán)境(IDE)直接創(chuàng)建過濾器。在創(chuàng)建過濾器時(shí)應(yīng)遵循命名規(guī)范,類名首字母大寫。

3.2 Filter的配置

Filter的配置和Servlet的配置類似,配置內(nèi)容包含初始化參數(shù)(initParams,可選)、過濾路徑(urlPatterns,必選)、過濾類型(dispatcherTypes,可選)。在Servlet3.0以前的版本中,只能在web.xml文件中配置過濾器,而在Servlet3.0以及之后的版本中,可以在web.xml文件中配置,也可以通過注解的方式來配置。

1)在web.xml文件中配置

在項(xiàng)目的WEB-INF文件夾中的web.xml文件編寫以下配置信息:

filtername

filterclass

namevlaue

filtername

url

2)使用注解配置Filter

@WebFilter(

filterName = "filtername",

urlPatterns = {" urlPatterns "},

servletNames = {"servletname",…})

filterName屬性用于指定過濾器名字。urlPatterns屬性用于指定過濾路徑,若該屬性值為"/*"表示過濾所有文件,屬性值為"*.suffix"表示過濾指定類型文件,屬性值為"/folder/*"表示過濾指定文件夾下所有文件,屬性值為"/filename.suffix"表示過濾掉指定文件。

3.3 Filter的執(zhí)行順序

Filter的doFilter方法在Servlet的service方法被調(diào)用之前執(zhí)行。在doFilter方法中,首先執(zhí)行chain.doFilter()方法之前的代碼,再執(zhí)行chain.doFilter()把請求信息傳遞給下一個(gè)過濾器或直接傳遞給目標(biāo)資源,服務(wù)器響應(yīng)之后再執(zhí)行chain.doFilter()方法之后的代碼。

若使用了多個(gè)Filter組成了過濾鏈,Web容器將按配置文件中的配置順序進(jìn)行裝載。若存在注解方式配置的過濾器,則再按照過濾器類名首字母順序進(jìn)行裝載。特別注意的是,當(dāng)對指定的servletname進(jìn)行過濾時(shí),Servlet采用注解方式配置無效,需在web.xml文件中進(jìn)行配置。

4 Filter的應(yīng)用

4.1 統(tǒng)一全站編碼

在Java EE項(xiàng)目開發(fā)中,經(jīng)常會(huì)出現(xiàn)亂碼問題,F(xiàn)ilter能夠在調(diào)用servlet的service方法之前對request進(jìn)行處理,在離開Servlet后(返回客戶端之前)處理response,因此可以使用Filter對全站編碼進(jìn)行統(tǒng)一。將此編碼過濾器的過濾路徑設(shè)置為"/*",具體開發(fā)步驟如下。

1)使用注解配置Filter

@WebFilter(urlPatterns = {"/*"})

2)編寫核心代碼

由于提交方式大多為get和post方法,因此在doFilter方法中主要對以上兩種提交方式的編碼進(jìn)行處理,核心代碼如下。

if("post".equals(request.getMethod())){

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

}else if("get".equals(request.getMethod()){

String param =

request.getParameter("param");

param = new String(param.

getBytes("ISO-8859-1"),"UTF-8");

}

chain.doFilter(request, response);

post提交方式直接使用request的setCharacterEncoding()方法設(shè)置字符編碼,get提交方式則需要先通過getBytes()方法將字符串按ISO-8859-1進(jìn)行解碼,然后再將獲得的字節(jié)碼按UTF-8編碼構(gòu)造字符串[4]。若JSP頁面的charset、pageEncoding都設(shè)置為UTF-8,則get提交方式不會(huì)亂碼。因此在項(xiàng)目開發(fā)之前建議將所有文件的編碼統(tǒng)一為UTF-8,這樣能提高了開發(fā)效率,降低了程序亂碼出現(xiàn)的概率[5]。

4.2 控制頁面緩存

Web緩存主要用于存放曾經(jīng)訪問的頁面內(nèi)容(包括圖片以及cookie文件等),緩存可以減少響應(yīng)的等待時(shí)間和網(wǎng)絡(luò)帶寬消耗。但是在實(shí)際項(xiàng)目開發(fā)過程中,為了確保動(dòng)態(tài)頁面的及時(shí)更新、驗(yàn)證碼的有效性等,一般會(huì)禁止動(dòng)態(tài)頁面緩存。

禁止緩存可以通過response設(shè)置響應(yīng)頭信息來實(shí)現(xiàn)。Filter技術(shù)能夠?qū)eb服務(wù)器的響應(yīng)信息進(jìn)行處理,并能通過配置實(shí)現(xiàn)對指定的某類型文件進(jìn)行響應(yīng)信息處理。因此若想對某一類文件進(jìn)行緩存控制,使用Filter技術(shù)便能快速實(shí)現(xiàn),具體開發(fā)步驟如下:

1)使用注解配置Filter

@WebFilter(urlPatterns = {" *.jsp"})

2)編寫核心代碼

緩存控制可以通過設(shè)置頭信息的Cache-control和Pragma屬性來實(shí)現(xiàn),也可以通過設(shè)置時(shí)間頭信息的Expires屬性來實(shí)現(xiàn),核心代碼如下:

response.setDateHeader("Expires", -1);

response.setHeader("Cache-control",

"no-cache");

response.setHeader("Pragma","no-cache");

由于不是所有的瀏覽器都支持指定的響應(yīng)頭,因此在開發(fā)過程中通常會(huì)同時(shí)使用上述方法。setDateHeader方法中第一個(gè)參數(shù)Expires是HTTP消息報(bào)頭中的實(shí)體報(bào)頭,用于設(shè)置響應(yīng)過期的日期和時(shí)間。如果是非法的日期格式(如0,-1等)則可看作該頁面已經(jīng)過期。Cache-control是用于控制是否緩存,當(dāng)把緩存指令設(shè)置為no-cache時(shí)表示不緩存請求和響應(yīng)。Pragma設(shè)置為no-cache時(shí)也表示不緩存,該方法可應(yīng)用于HTTP 1.0和HTTP 1.1中。

4.3 驗(yàn)證用戶身份

現(xiàn)如今很多的Web應(yīng)用都需要進(jìn)行身份驗(yàn)證,這些Web應(yīng)用中大多資源都需要用戶登錄后才能訪問,如果不進(jìn)行權(quán)限控制,在訪問過程中很可能出現(xiàn)資源外泄、程序異常等問題。

過濾器可以決定目標(biāo)資源是否能被訪問,因此可以將需要將登錄后才能訪問的資源全部加入過濾器的過濾路徑中并在該過濾器的doFilter()方法中對發(fā)起請求的用戶身份進(jìn)行驗(yàn)證。采用過濾器對所有用戶請求進(jìn)行攔截,然后根據(jù)用戶是否登錄來控制用戶請求的轉(zhuǎn)發(fā),做好過濾器的配置與功能設(shè)置,后續(xù)開發(fā)過程中不需要在頁面檢測用戶是否登錄[6]。

用戶在進(jìn)行身份認(rèn)證后都會(huì)在session中留下相應(yīng)的權(quán)限標(biāo)識,當(dāng)用戶訪問需要授權(quán)的頁面時(shí),過濾器會(huì)在session中查找該用戶是否已經(jīng)獲得授權(quán),如果查找成功則表示該用戶已獲取授權(quán)并允許訪問,反之則禁止訪問。

在Filter中讀取session中特定的權(quán)限標(biāo)記flag,若獲取到的值不為null,則允許訪問下一過濾器或目標(biāo)資源,否則重定向到主頁面,具體開發(fā)步驟如下:

1)使用注解配置Filter

@WebFilter(urlPatterns={"/folder/*"})

2)編寫核心代碼

if(session.getAttribute("flag")!=null){

chain.doFilter(request, response);

}else{

response.sendRedirect("index.jsp");

}

過濾器不僅能對用戶身份進(jìn)行驗(yàn)證,還能實(shí)現(xiàn)用戶粗粒度權(quán)限管理,解決具有管理員、普通會(huì)員和普通游客等多角色用戶的權(quán)限管理問題[7]。

4.4 網(wǎng)站流量統(tǒng)計(jì)

Filter可以對用戶提交的數(shù)據(jù)或服務(wù)器返回的數(shù)據(jù)進(jìn)行更改。任何到達(dá)服務(wù)器的請求都可以讓其先經(jīng)過Filter的處理。根據(jù)Filter的這一特點(diǎn)可以編寫一個(gè)專門用于統(tǒng)計(jì)網(wǎng)站訪問量的過濾器,開發(fā)步驟如下。

1)使用注解配置Filter

@WebFilter(urlPatterns = {"/index.jsp"})

2)編寫核心代碼

首先在過濾器中定義全局變量count來保存網(wǎng)站的訪問量,然后在doFilter方法中編寫如下代碼:

this.count++;

request.getServletContext.

setAttribute("count", count);

考慮到當(dāng)多用戶訪問時(shí),會(huì)產(chǎn)生數(shù)據(jù)共享沖突,引起統(tǒng)計(jì)的數(shù)據(jù)不準(zhǔn)確。因此在開發(fā)中可以用關(guān)鍵字synchronized修飾doFilter方法來解決。

4.5 敏感字符過濾

為了防止輸出非法內(nèi)容或者敏感內(nèi)容,一般情況下網(wǎng)站都需要對顯示內(nèi)容進(jìn)行控制,常規(guī)的辦法是在保存到數(shù)據(jù)庫之前對非法內(nèi)容進(jìn)行替換,但這種方法具有局限性,工作量大并且耦合性也較高。然而過濾器可以在用戶發(fā)送數(shù)據(jù)到服務(wù)器時(shí)就對敏感字進(jìn)行處理,保證在寫入數(shù)據(jù)庫時(shí)不存在非法內(nèi)容,具體開發(fā)步驟如下。

1)使用注解配置Filter

@WebFilter(servletNames=

{"servletName","……"})

2)編寫核心代碼

在doFilter方法中獲取用戶發(fā)送的數(shù)據(jù),并查找數(shù)據(jù)中是否包含有敏感字符,如果有就把所有的敏感字替換成“***”,關(guān)鍵代碼如下:

String message = request.

getParameter("mes");

if(message!=null &&

message.indexOf("敏感字") >= 0){

message=message.replace("敏感字","**");}

request.setAttribute("con", message);

}

4.6 獲取cookies信息

為了增加用戶體驗(yàn)效果,一般在登錄界面都會(huì)設(shè)置“是否保存用戶信息”的選項(xiàng),當(dāng)勾選該選項(xiàng)后,用戶在一定時(shí)間內(nèi)再次訪問該頁面就無需再次輸入用戶信息。這些信息都是由服務(wù)器寫入到客戶端的cookie中進(jìn)行保存的。

過濾器能夠在請求信息到達(dá)服務(wù)器之前讀取請求信息,因此可以利用Filter實(shí)現(xiàn)cookie的掃描,實(shí)現(xiàn)信息的獲取。當(dāng)用戶訪問登錄界面時(shí),F(xiàn)ilter對發(fā)送請求的客戶端進(jìn)行cookies掃描,如果查找到指定的cookie,則將其中的信息讀取出來并保存到session作用域中,具體開發(fā)步驟如下。

1) 通過注解配置Filter

@WebFilter(urlPatterns = {"/login.jsp"})

2)編寫核心代碼

實(shí)現(xiàn)獲取到客戶端所有的cookie信息,并利用循環(huán)進(jìn)行遍歷,核心代碼如下:

Cookies[] cookies = request.getCookies();

for (Cookie cookie : cookies) {

if("username".equals(cookie.getName())){

request.setAttribute("username",

cookie.getValue());

}

if("password".equals(cookie.getName())){

request.setAttribute("password",

cookie.getValue());

}

}

特別需要注意的是,如果要在cookie保存中文字符,則需要用URLEncoder.encode("中文","UTF-8")對保存信息進(jìn)行編碼后保存,并在讀取cookie之后使用URLDecoder.decode(cookie.getValue(),"UTF-8")進(jìn)行解碼。

5 總結(jié)

Filter是為將繁瑣問題簡化而出現(xiàn)的技術(shù)。通過改變請求或響應(yīng)中的內(nèi)容。能快速地進(jìn)行實(shí)際需求開發(fā),熟練地掌握這一技術(shù)既可以提高項(xiàng)目的可維護(hù)性也可以減輕開發(fā)人員的負(fù)擔(dān)。

參考文獻(xiàn):

[1] 池亞平, 方勇. Servlet技術(shù)與應(yīng)用方法[J]. 北京: 郵電大學(xué)學(xué)報(bào), 2003(S1): 137-139, 143.

[2] 李建. Java Web開發(fā)中過濾器組件應(yīng)用及實(shí)例解析[J]. 電腦開發(fā)與應(yīng)用, 2009, 22(11): 58-60.

[3] 高翔, 李志浩. Java Web開發(fā)與實(shí)踐[M]. 北京: 人民郵電出版社, 2014.

[4] 王健. Java編程漢字亂碼原因分析及解決方法研究[J]. 山西煤炭管理干部學(xué)院學(xué)報(bào), 2015, 28(3): 185-186, 189.

[5] 周兵. Java Web開發(fā)中的中文亂碼問題分析及解決方案[J]. 電腦知識與技術(shù), 2014, 10(29): 6884-6888.

[6] 熊傳玉, 徐尤華. 過濾器在Java Web開發(fā)中的應(yīng)用研究[J]. 信息技術(shù), 2015(6): 37-41.

[7] 李玉臣. 基于Filter技術(shù)的用戶粗粒度權(quán)限管理的實(shí)現(xiàn)[J]. 電腦編程技巧與維護(hù), 2018(3): 69-71.

猜你喜歡
開發(fā)技術(shù)過濾器
基于Fluent的過濾器內(nèi)部流場數(shù)值模擬
聲音過濾器
趣味(語文)(2018年2期)2018-05-26 09:17:55
計(jì)算機(jī)應(yīng)用軟件開發(fā)技術(shù)的幾點(diǎn)探討
電子制作(2017年14期)2017-12-18 07:08:10
防散脫緯編無痕彈力面料開發(fā)技術(shù)國際領(lǐng)先
中國煤層氣開發(fā)技術(shù)的現(xiàn)狀與未來
中國煤層氣(2014年4期)2014-08-07 03:08:42
基于LOGO!的空氣過濾器自潔控制系統(tǒng)
復(fù)雜產(chǎn)品設(shè)計(jì)知識應(yīng)用開發(fā)技術(shù)研究
HVM膜過濾器管板改造總結(jié)
中國氯堿(2014年11期)2014-02-28 01:05:07
余江县| 綦江县| 额济纳旗| 台山市| 东阳市| 虎林市| 延庆县| 平昌县| 阳高县| 彰化市| 沅江市| 阜新市| 南木林县| 辽源市| 巍山| 塔河县| 岱山县| 缙云县| 光泽县| 灌南县| 漠河县| 松江区| 新乡市| 枝江市| 连平县| 长宁县| 夏邑县| 修水县| 宁武县| 抚宁县| 永平县| 罗平县| 嘉兴市| 浠水县| 拜城县| 邵东县| 龙泉市| 灵宝市| 美姑县| 高台县| 板桥市|