Java培訓總結:過濾器鏈的實現方法、配置和案例分析

千鋒武漢發表於2021-06-17

  今天 千鋒老師給大家分享的是Java培訓總結:過濾器鏈的實現方法、配置和案例分析。

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

   過濾器鏈

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

圖片1

   實現方法:

   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" "

  <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="text" name="name" placehoder="輸入姓名"><br>

  <input type="text" name="age" placehoder="輸入年齡"><br>

  <input type="submit" value="新增使用者">

  <!-- 將token放到隱藏域中 -->

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

  </form>

  </body>

  </html>

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2777079/,如需轉載,請註明出處,否則將追究法律責任。

相關文章