【JavaWeb-Servlet】筆記(5)--- Filter介面(過濾器介面);通過過濾器優化線上考試系統的安全性;最終版網際網路通訊原理圖
阿新 • • 發佈:2022-03-17
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>
最終版網際網路通訊原理圖: