1. 程式人生 > 其它 >【JavaWeb-Servlet】筆記(5)--- Filter介面(過濾器介面);通過過濾器優化線上考試系統的安全性;最終版網際網路通訊原理圖

【JavaWeb-Servlet】筆記(5)--- Filter介面(過濾器介面);通過過濾器優化線上考試系統的安全性;最終版網際網路通訊原理圖

Servlet 規範擴充套件 ---- Filter介面(過濾器介面):


1、介紹:

1)來自於 Servlet 規範下介面,在 Tomcat 中存在於servlet-api.jar包。

2)Filter 介面實現類由開發人員負責提供,Http 伺服器不負責提供。

3)Filter 介面在 Http 伺服器呼叫資原始檔之前,對 Http 伺服器進行攔截。

 

2、具體作用:

1)攔截 Http 伺服器,幫助 Http 伺服器檢測當前請求合法性。

2)攔截 Http 伺服器,對當前請求進行增強操作。

 

3、Filter 介面實現類開發步驟(三步):

1)建立一個 Java 類實現 Filter 介面。

2)重寫 Filter 介面中 doFilter 方法。

3)web.xml 將過濾器介面實現類註冊到 Http 伺服器。

 

4、Filter 攔截地址格式:

1)命令格式(oneFilter 為 我們寫的一個過濾器介面實現類):

<filter-mapping>
    <filter-name>oneFilter</filter-name>
    <url-pattern>攔截地址</url-pattern>
</filter-mapping>

 

 

2)命令作用:攔截地址通知 Tomcat 在呼叫 ?? 資原始檔之前需要呼叫 OneFilter 過濾進行攔截。

 

3)要求 Tomcat 在呼叫某一個具體檔案之前,來呼叫 OneFilter 攔截

<url-pattern>/img/mm.jpg</url-pattern>

 

4)要求 Tomcat 在呼叫某一個資料夾下所有的資原始檔之前,來呼叫 OneFilter 攔截

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

 

5)要求 Tomcat 在呼叫任意資料夾下某種型別檔案之前,來呼叫 OneFilter 攔截

<url-pattern>*.jpg</url-pattern>

 

6)要求 Tomcat 在呼叫網站中任意檔案時,來呼叫 OneFilter 攔截

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

 

通過過濾器優化線上考試系統的安全性:


  • com.burnyouth.controller.LoginServlet(實現登入驗證功能):
package com.burnyouth.controller;

import com.burnyouth.dao.UserDao;
import jakarta.servlet.*;
import jakarta.servlet.http.*;

import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userName, password;
        UserDao dao = new UserDao();
        int result = 0;

        request.setCharacterEncoding("utf-8");
        userName = request.getParameter("userName");
        password = request.getParameter("password");
        result = dao.login(userName,password);
        if (result == 1) {
            //在判斷來訪使用者合法後,通過請求物件向 Tomcat 申請為當前使用者申請一個 HttpSession
            HttpSession session = request.getSession();
            response.sendRedirect("/myWeb/index.html");
        } else {
            response.sendRedirect("/myWeb/login_error.html");
        }
    }
}

 

  • com.burnyouth.filter.OneFilter(實現拒絕非法使用者請求內部檔案資源的功能):
package com.burnyouth.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //將 ServletRequest 強轉為 HttpServletRequest,以呼叫getRequestDispatcher()
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = null;

        //呼叫請求物件讀取請求協議包中的URI,瞭解使用者要訪問的資原始檔是什麼
        String uri = request.getRequestURI();

        //如果本次請求資原始檔與登入有關(login.html或者/myWeb等),應該無條件放行
        if (uri.indexOf("login") != -1 || "/myWeb/".equals(uri)) {
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }


        //如果本次請求訪問的是其他資原始檔,需要判斷使用者是否已經登入過了(判斷HttpSession是否被建立)
        session = request.getSession(false);

        //判斷來訪使用者是否合法
        if (session == null) {
            request.getRequestDispatcher("/login_error.html").forward(servletRequest,servletResponse);
            return;
        }

        //放行
        filterChain.doFilter(servletRequest,servletResponse);

    }
}

 

xml(僅展示過濾器相關程式碼):

<filter>
    <filter-name>OneFliter</filter-name>
    <filter-class>com.burnyouth.filter.OneFilter</filter-class>
</filter>

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

最終版網際網路通訊原理圖: