Xbox Edge瀏覽器將支援GeForce Now服務
阿新 • • 發佈:2021-10-25
1.1 基本概念
- Filter本意為”過濾“的含義,是JavaWeb的三大元件之一,三大元件為:Servlet、Filter、Listener。
- 過濾器是向 Web 應用程式的請求和響應處理新增功能的 Web 服務元件。
- 過濾器相當於瀏覽器與Web資源之間的一道過濾網,在訪問資源之前通過一系列的過濾器對請求
進行修改、判斷以及攔截等,也可以對響應進行修改、判斷以及攔截等。
1.2 Filter原理
1.3 Filter基本使用
1.3.1 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登入頁面</title> </head> <body> <form action="login" method="post"> 使用者姓名: <input type="text" name="userName"><br/> 使用者密碼: <input type="password" name="password"><br/> <input type="submit" value="註冊"/> </form> </body> </html>
1.3.2 LoginServlet
package cn.guardwhy.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /* 控制器:Servlet */ @WebServlet(name = "LoginServlet", urlPatterns = "/login") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.獲取請求中的使用者名稱和密碼 String userName = request.getParameter("userName"); System.out.println("獲取到的使用者名稱:" + userName); String password = request.getParameter("password"); System.out.println("獲取到的密碼:" + password); // 2.使用者名稱和密碼校驗 if("Curry".equals(userName) && "1234".equals(password)){ System.out.println("登入成功,歡迎使用"); // 3.儲存使用者資訊 request.getSession().setAttribute("userName", userName); // 4.重定向 response.sendRedirect("main.jsp"); }else { System.out.println("使用者名稱或者密碼錯誤,請重新輸入..."); // 5.轉發 request.getRequestDispatcher("login.jsp").forward(request, response); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
1.3.3 main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>頁面主題</title>
</head>
<body>
<h3>登入成功,歡迎${sessionScope.username}使用</h3>
</body>
</html>
1.3.4 LoginFilter
package cn.guardwhy.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; /* 攔截器 */ public class LoginFilter implements Filter { @Override // web伺服器啟動,過濾器開始初始化,隨時等待過濾物件出現。 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("過濾器開始初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { // 0.設定編碼 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=UTF-8"); // 1.獲取session物件 HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpSession session = httpServletRequest.getSession(); // 2.得到使用者名稱 Object userName = session.getAttribute("userName"); // 3.獲取Servlet請求路徑 String servletPath = httpServletRequest.getServletPath(); // 4.假設沒有登入,則返回登入頁面 if(null == userName && !servletPath.contains("login") ){ // 轉發 request.getRequestDispatcher("login.jsp").forward(request, response); }else{ // 5.登入則放行 filterChain.doFilter(request, response); } } @Override // web伺服器關閉的時候,過濾器銷燬 public void destroy() { System.out.println("過濾器銷燬。。"); } }
1.3.5 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--過濾器-->
<filter>
<filter-name>LoginServlet</filter-name>
<filter-class>cn.guardwhy.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginServlet</filter-name>
<url-pattern>/main.jsp</url-pattern>
<!--<url-pattern>/*</url-pattern>-->
</filter-mapping>
</web-app>
執行結果
1.4 Filter介面
1.4.1 基本概念
javax.servlet.Filter介面主要用於描述過濾器物件,可以對資源的請求和資源的響應操作進行篩選操作。
1.4.2 常用的方法
方法宣告 | 作用 |
---|---|
void init(FilterConfig filterConfig) | 實現過濾器的初始化操作。 |
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) | 執行過濾操作的功能。 |
void destroy() | 實現過濾器的銷燬操作。 |
1.5 FilterConfig介面
1.5.1 基本概念
javax.servlet.FilterConfig介面主要用於描述過濾器的配置資訊。
1.5.2 常用方法
方法宣告 | 作用 |
---|---|
String getFilterName() | 獲取過濾器的名字。 |
String getInitParameter(String name) | 獲取指定的初始化引數資訊。 |
Enumeration getInitParameterNames() | 獲取所有的初始化操作名稱 |
ServletContext getServletContext() | 獲取ServletContext物件。 |
程式碼示例
package cn.guardwhy.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;
/*
攔截器
*/
public class LoginFilter implements Filter {
@Override
// web伺服器啟動,過濾器開始初始化,隨時等待過濾物件出現。
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化操作正在火熱進行中...");
System.out.println("獲取到的過濾器名稱為:" + filterConfig.getFilterName());
String userName = filterConfig.getInitParameter("userName");
System.out.println("獲取到指定初始化引數的數值為:" + userName);
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
System.out.println("獲取到的初始化引數名為:" + initParameterNames.nextElement());
}
ServletContext servletContext = filterConfig.getServletContext();
System.out.println("獲取到的上下文物件是:" + servletContext);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
1.6 多個過濾器
如果有多個過濾器都滿足過濾的條件,則容器依據對映的先後順序來呼叫各個過濾器。