Java技術學習總結:過濾器鏈的實現(xiàn)方法、配置和案例分析

今天給大家分享的是Java技術學習總結:過濾器鏈的實現(xiàn)方法、配置和案例分析。

過濾器能夠對網(wǎng)站中的各種內(nèi)容進行過濾(頁面、Servlet、圖片、文件),可以在網(wǎng)站內(nèi)容請求和響應時進行一些操作,完成一些通用的功能。

過濾器鏈

在項目中可以創(chuàng)建多個過濾器,網(wǎng)站內(nèi)容可能會經(jīng)過多個過濾器,多個過濾器就形成了過濾器鏈。


實現(xiàn)方法:

1、實現(xiàn)Filter接口

init初始化

doFilter進行過濾

參數(shù):

ServletRequest請求

ServletResponse響應

FilterChain過濾器鏈

//讓請求通過,執(zhí)行下一個過濾器,如果不執(zhí)行這個方法,請求就被攔截

chain.doFilter(request, response);

destroy銷毀

2、配置

web.xml


<filter>

<filter-name>Filter1</filter-name>

<filter-class>com.qianfeng.filters.Filter1</filter-class>

</filter>

<filter-mapping>

<filter-name>Filter1</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

解釋:*代表所有的網(wǎng)站內(nèi)容都過這個過濾器,可以指定被過濾的內(nèi)容,如:

<url-pattern>/test1.jsp</url-pattern>

<url-pattern>/test2.jsp</url-pattern>


注解:

@WebFilter({"/*"})

@WebFilter({"/test1.jsp","/test2.jsp"})

過濾器執(zhí)行的順序:

如果是注解配置的,按名字順序進行執(zhí)行

如果是web.xml配置的,按過濾器filter定義的順序


案例:表單重復提交問題

把表單數(shù)據(jù)多次提交給服務器

問題:1、加大服務器的負擔 2、多次插入重復的數(shù)據(jù)

可能出現(xiàn)重復提交的情況:

1、提交表單后,用forward跳轉到其它頁面,刷新頁面

2、提交表單后,服務器還沒有響應前,多次刷新頁面

3、提交表單后,服務器還沒有響應前,多次點擊提交按鈕

4、提交表單后,跳轉后點擊返回,點擊提交

解決方法:

1、進入表單頁面前,在過濾器中創(chuàng)建Token(令牌)隨機字符串,保存到Session中。

2、在表單中添加一個隱藏域,值是Token字符串,會和表單一起提交服務器

3、提交服務器后,將表單中Token和Session中Token進行比較,如果相同就正常提交表單,否則就是重復提交。

4、如果能夠成功提交后,把Session中的Token去掉。


??/**

*生成令牌的過濾器

?*/

@WebFilter({"/resubmit.jsp"})

public class TokenFilter implements Filter{


@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

//產(chǎn)生隨機字符串

String token = UUID.randomUUID().toString();

//保存到Session中

HttpServletRequest res = (HttpServletRequest) request;

res.getSession().setAttribute("token", token);

//執(zhí)行后面的過濾器

chain.doFilter(request, response);

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {}

@Override

public void destroy() {}

}




?/**

*模擬添加數(shù)據(jù)的Servlet

?*/

@WebServlet("/add.do")

public class AddUserServlet extends HttpServlet{

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//判斷表單中的token是否和Session中的token一樣

String token1 = (String) req.getSession().getAttribute("token");

String token2 = req.getParameter("token");

if(!token1.equals(token2)){

//如果不相同,就是重復提交

System.out.println("這是重復提交");

return;

}

String name = req.getParameter("name");

String age = req.getParameter("age");

//模擬代碼,成功插入數(shù)據(jù)庫

System.out.println(name+","+age+"插入到數(shù)據(jù)庫");

//將Session中的token去掉

req.getSession().setAttribute("token", "");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

req.getRequestDispatcher("test.jsp").forward(req, resp);

}


JSP頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"

????pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="add.do" method="post">


<input type="hidden" name="token" value="${token}">

</form>

</body>

</html>

過濾器能過濾網(wǎng)站中的各種資源,給Servlet和JSP添加一些額外的功能,如:設置編碼格式、對用戶進行登錄驗證、解決重復提交問題等。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內(nèi)容