1. 程式人生 > 遊戲 >Xbox Edge瀏覽器將支援GeForce Now服務

Xbox Edge瀏覽器將支援GeForce Now服務

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 多個過濾器

如果有多個過濾器都滿足過濾的條件,則容器依據對映的先後順序來呼叫各個過濾器。