1. 程式人生 > >Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析

Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析

今天給大家分享的是Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析。

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

過濾器鏈

在專案中可以建立多個過濾器,網站內容可能會經過多個過濾器,多個過濾器就形成了過濾器鏈。

 


 

實現方法:

1、實現Filter介面

init初始化

doFilter進行過濾

引數:

ServletRequest請求

ServletResponse響應

FilterChain過濾器鏈

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

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>

解釋:*代表所有的網站內容都過這個過濾器,可以指定被過濾的內容,如:

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

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

 

註解:

@WebFilter({"/*"})

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

過濾器執行的順序:

如果是註解配置的,按名字順序進行執行

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

 

案例:表單重複提交問題

把表單資料多次提交給伺服器

問題:1、加大伺服器的負擔 2、多次插入重複的資料

可能出現重複提交的情況:

1、提交表單後,用forward跳轉到其它頁面,重新整理頁面

2、提交表單後,伺服器還沒有響應前,多次重新整理頁面

3、提交表單後,伺服器還沒有響應前,多次點選提交按鈕

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

解決方法:

1、進入表單頁面前,在過濾器中建立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 {

//產生隨機字串

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

//儲存到Session中

HttpServletRequest res = (HttpServletRequest) request;

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

//執行後面的過濾器

chain.doFilter(request, response);

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {}

@Override

public void destroy() {}

}

 

 

 

 /**

*模擬新增資料的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");

//模擬程式碼,成功插入資料庫

System.out.println(name+","+age+"插入到資料庫");

//將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>

過濾器能過濾網站中的各種資源,給Servlet和JSP新增一些額外的功能,如:設定編碼格式、對使用者進行登入驗證、解決重複提交問題等。