最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb中的Filter過濾器解讀

 更新時(shí)間:2023年10月17日 09:06:42   作者:Neo丶  
這篇文章主要介紹了JavaWeb中的Filter過濾器解讀,Filter過濾器是JavaWeb的三大組件之一,Filter過濾器是JavaEE的規(guī)范也就是接口,Filter的作用是攔截請求,過濾響應(yīng),需要的朋友可以參考下

Filter過濾器

Filter過濾器是JavaWeb的三大組件之一,F(xiàn)ilter過濾器是JavaEE的規(guī)范也就是接口,F(xiàn)ilter的作用是攔截請求,過濾響應(yīng)。

攔截請求常見的應(yīng)用場景:權(quán)限檢查、日志操作、事務(wù)管理等等。

Filter過濾器的基本使用

例如權(quán)限檢查,若沒有成功驗(yàn)證用戶信息無法打開目標(biāo)頁面。

<%
    Object user = session.getAttribute("user");
    if (user == null){
        request.getRequestDispatcher("/login.jsp").forward(request,response);
        return;
    }
%>

用戶登錄后會(huì)將用戶登陸信息保存到Session域中,所以要檢查用戶是否登錄,判斷Session中是否包含用戶登錄信息。

客戶端(瀏覽器) -> Filter過濾器(進(jìn)行權(quán)限檢查,檢查用戶是否有登錄,如果有權(quán)限則程序默認(rèn)執(zhí)行,如果沒有權(quán)限控制程序流轉(zhuǎn),不允許其訪問)

package com.pero.servlet;
 
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
 
import java.io.IOException;
 
public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
 
    @Override
    public void destroy() {
 
    }
 
    /**
     * doFilter方法專門用于攔截請求,可以做權(quán)限檢查
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //先獲取httpServletRequest對象,通過該對象獲取Session
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object attribute = session.getAttribute("user");
        //表示還沒有登陸
        if (attribute == null){
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }else {
            //程序繼續(xù)向下執(zhí)行
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <!-- Filter標(biāo)簽用于配置一個(gè)Filter過濾器 -->
    <filter>
        <!-- 配置Filter別名 -->
        <filter-name>AdminFilter</filter-name>
        <!-- 配置Filter全類名 -->
        <filter-class>com.pero.servlet.AdminFilter</filter-class>
    </filter>
    <!-- 配置Filter過濾器的攔截路徑 -->
    <filter-mapping>
        <!-- 表示當(dāng)前攔截路徑給哪一個(gè)Filter -->
        <filter-name>AdminFilter</filter-name>
        <!-- 配置攔截路徑
            /admin/*    表示http://ip:port/工程路徑/     admin目錄下的所有文件
        -->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.pero.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
</web-app>
package com.pero.servlet;
 
import jakarta.servlet.*;
import jakarta.servlet.http.*;
 
import java.io.IOException;
 
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if ("root".equals(username) && "root".equals(password)){
            request.getSession().setAttribute("user",username);
            response.getWriter().write("登陸成功");
        }else {
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
    }
}
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/3/16
  Time: 22:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陸頁面</title>
</head>
<body>
  <form action="http://localhost:8080/Filter_Web/loginServlet" method="get">
      用戶名:<input type="text" name="username"><br/>
      密碼:<input type="password" name="password"><br/>
      <input type="submit" value="提交">
  </form>
</body>
</html>

Filter的生命周期

Filter的生命周期是指Filter從創(chuàng)建到銷毀整個(gè)過程執(zhí)行方法的順序。包含以下方法:

1.構(gòu)造器方法;

2.init初始化方法;

3.doFilter過濾方法;

4.destory銷毀方法;

在Web工程啟動(dòng)的時(shí)候構(gòu)造器方法和初始化方法會(huì)被執(zhí)行(Filter對象已經(jīng)創(chuàng)建),每次攔截到請求時(shí)會(huì)執(zhí)行doFilter方法,停止Web工程的時(shí)候就會(huì)執(zhí)行destory方法。

FilterConfig類

FilterConfig類是Filter過濾器的配置文件類,Tomcat每次創(chuàng)建Filter的時(shí)候也會(huì)同時(shí)創(chuàng)建一個(gè)FilterConfig類,這里面包含了Filter配置文件的配置信息。

FilterConfig類的作用是獲取Filter過濾器的配置內(nèi)容

1.獲取Filter的名稱filter-name的內(nèi)容

2.獲取web.xml配置的init-param初始化參數(shù)

3.獲取ServletContext對象

package com.pero.servlet;
 
import jakarta.servlet.*;
 
import java.io.IOException;
 
public class TestFilter implements Filter {
 
    public TestFilter() {
        System.out.println("構(gòu)造方法");
    }
 
    public void init(FilterConfig config) throws ServletException {
        System.out.println("init初始化方法");
        //獲取Filter的名稱filter-name的內(nèi)容
        String filterName = config.getFilterName();
        //獲取web.xml配置的init-param初始化參數(shù)
        System.out.println("filter-name為:" + filterName);
        String username = config.getInitParameter("username");
        String url = config.getInitParameter("url");
        System.out.println("username:" + username + "url:" + url);
        //獲取ServletContext對象
        ServletContext servletContext = config.getServletContext();
        System.out.println("servletContext:" + servletContext);
    }
 
    public void destroy() {
        System.out.println("destory銷毀方法");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        System.out.println("doFilter方法");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <!-- Filter標(biāo)簽用于配置一個(gè)Filter過濾器 -->
    <filter>
        <!-- 配置Filter別名 -->
        <filter-name>AdminFilter</filter-name>
        <!-- 配置Filter全類名 -->
        <filter-class>com.pero.servlet.AdminFilter</filter-class>
    </filter>
    <filter>
        <filter-name>TestFilter</filter-name>
        <filter-class>com.pero.servlet.TestFilter</filter-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>TestFilter</filter-name>
        <url-pattern>/testFilter</url-pattern>
    </filter-mapping>
    <!-- 配置Filter過濾器的攔截路徑 -->
    <filter-mapping>
        <!-- 表示當(dāng)前攔截路徑給哪一個(gè)Filter -->
        <filter-name>AdminFilter</filter-name>
        <!-- 配置攔截路徑
            /admin/*    表示http://ip:port/工程路徑/     admin目錄下的所有文件
        -->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.pero.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
</web-app>

FilterChain過濾器鏈

客戶端(瀏覽器) -> 服務(wù)器(Filter①:執(zhí)行doFilter()方法:前置代碼1 ->chain.doFilter(request, response); -> Filter②:執(zhí)行doFilter()方法 :前置代碼1 -> chain.doFilter(request, response); -> 查詢目標(biāo)資源,找到并獲取 -> 后置代碼2 ->Filter①:執(zhí)行doFilter()方法:后置代碼2)

FilterChain.doFilter()方法的作用:①如果有其他的Filter過濾器,執(zhí)行下一個(gè)Filter過濾器;②如果沒有其他需要執(zhí)行的過濾器,執(zhí)行目標(biāo)資源。

多個(gè)Filter過濾器執(zhí)行的時(shí)候他們執(zhí)行的優(yōu)先順序是由在web.xml中filter-mapping從上到下的配置順序決定的。

多個(gè)Filter過濾器執(zhí)行的特點(diǎn):

①所有Filter和目標(biāo)資源默認(rèn)都執(zhí)行在同一個(gè)線程中

②多個(gè)Filter共同執(zhí)行的時(shí)候,他們都使用同一個(gè)Request對象。

package com.pero.servlet;
 
import jakarta.servlet.*;
 
import java.io.IOException;
import java.lang.Thread;
 
public class Filter1 implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }
 
    public void destroy() {
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        System.out.println("Filter1前置代碼");
        System.out.println("Filter1線程" + Thread.currentThread().getName());
        System.out.println("Filter1" + request.getParameter("username"));
        chain.doFilter(request, response);
        System.out.println("Filter1線程" + Thread.currentThread().getName());
        System.out.println("Filter1后置代碼");
    }
}
package com.pero.servlet;
 
import jakarta.servlet.*;
 
import java.io.IOException;
 
public class Filter2 implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }
 
    public void destroy() {
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        System.out.println("Filter2前置代碼");
        System.out.println("Filter2線程"+Thread.currentThread().getName());
        System.out.println("Filter2" + request.getParameter("username"));
        chain.doFilter(request, response);
        System.out.println("Filter2線程"+Thread.currentThread().getName());
        System.out.println("Filter2后置代碼");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
   ...
    <filter>
        <filter-name>Filter1</filter-name>
        <filter-class>com.pero.servlet.Filter1</filter-class>
    </filter>
 
    <filter>
        <filter-name>Filter2</filter-name>
        <filter-class>com.pero.servlet.Filter2</filter-class>
    </filter>
 
    <filter-mapping>
        <filter-name>Filter1</filter-name>
        <url-pattern>/target.jsp</url-pattern>
    </filter-mapping>
 
    <filter-mapping>
        <filter-name>Filter2</filter-name>
        <url-pattern>/target.jsp</url-pattern>
    </filter-mapping>
    ...
</web-app>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/3/17
  Time: 10:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        System.out.println("target頁面執(zhí)行");
        System.out.println("目標(biāo)資源"+Thread.currentThread().getName());
        System.out.println("目標(biāo)資源" + request.getParameter("username"));
    %>
</body>
</html>

Filter的攔截路徑

精確匹配

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

以上配置路徑表示請求地址必須為://ip:port/工程路徑/target.jsp

目標(biāo)匹配

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

以上配置的路徑,表示請求地址必須為://ip:port/工程路徑/admin/*

后綴名匹配

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

以上配置路徑,表示請求地址必須為:.html

Filter過濾器只關(guān)心請求的值是否匹配,不關(guān)心資源是否存在

到此這篇關(guān)于JavaWeb中的Filter過濾器解讀的文章就介紹到這了,更多相關(guān)Filter過濾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用poi-tl庫操作wold文檔的方法

    Java使用poi-tl庫操作wold文檔的方法

    java項(xiàng)目實(shí)際開發(fā)中經(jīng)常會(huì)遇到制作word表單且表格數(shù)據(jù)行循環(huán)功能,這篇文章主要介紹了Java使用poi-tl庫操作wold文檔的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • Java中自旋鎖與CAS機(jī)制的深層關(guān)系與區(qū)別

    Java中自旋鎖與CAS機(jī)制的深層關(guān)系與區(qū)別

    CAS算法即比較并替換,是一種實(shí)現(xiàn)并發(fā)編程時(shí)常用到的算法,Java并發(fā)包中的很多類都使用了CAS算法,這篇文章主要介紹了Java中自旋鎖與CAS機(jī)制深層關(guān)系與區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • 淺談Java鎖機(jī)制

    淺談Java鎖機(jī)制

    在多線程環(huán)境下,程序往往會(huì)出現(xiàn)一些線程安全問題,為此,Java提供了一些線程的同步機(jī)制來解決安全問題,比如:synchronized鎖和Lock鎖都能解決線程安全問題。下面小編就來詳細(xì)介紹該知識點(diǎn),需要的朋友可以參考一下
    2021-09-09
  • Java實(shí)現(xiàn)在word中指定位置插入圖片

    Java實(shí)現(xiàn)在word中指定位置插入圖片

    Poi-tl?是基于?Apache?POI?的?Java?開源文檔處理庫,專注于高效操作?Word?文檔,本文小編就來和大家詳細(xì)講講Java如何使用Poi-tl實(shí)現(xiàn)在word中指定位置插入圖片吧
    2025-06-06
  • Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    這篇文章主要給大家介紹了利用Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例,本文生成的是GIF格式 + 干擾元素,讓驗(yàn)證碼破解難度又上了一個(gè)層次,文中給出了詳細(xì)的示例代碼,并在文末給出了完整的實(shí)例代碼供大家下載學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-04-04
  • Java實(shí)現(xiàn)輕松提取word和pdf文檔內(nèi)容

    Java實(shí)現(xiàn)輕松提取word和pdf文檔內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)輕松提取word和pdf文檔內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-10-10
  • 如何使用Playwright對Java API實(shí)現(xiàn)自動(dòng)視覺測試

    如何使用Playwright對Java API實(shí)現(xiàn)自動(dòng)視覺測試

    這篇文章主要介紹了如何使用Playwright對Java API實(shí)現(xiàn)自動(dòng)視覺測試,幫助大家更好的理解和使用Playwright,感興趣的朋友可以了解下
    2021-01-01
  • Spring?Batch批處理框架操作指南

    Spring?Batch批處理框架操作指南

    Spring?Batch?是?Spring?提供的一個(gè)數(shù)據(jù)處理框架。企業(yè)域中的許多應(yīng)用程序需要批量處理才能在關(guān)鍵任務(wù)環(huán)境中執(zhí)行業(yè)務(wù)操作,這篇文章主要介紹了Spring?Batch批處理框架操作指南,需要的朋友可以參考下
    2022-07-07
  • Spring Cloud 配置中心內(nèi)容加密的配置方法

    Spring Cloud 配置中心內(nèi)容加密的配置方法

    這篇文章主要介紹了Spring Cloud 配置中心內(nèi)容加密的配置方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • SpringBoot中@GetMapping注解的使用

    SpringBoot中@GetMapping注解的使用

    @GetMapping注解是Spring Boot中最常用的注解之一,它可以幫助開發(fā)者定義和處理HTTP GET請求,本文就來介紹一下SpringBoot中@GetMapping注解的使用,感興趣的可以了解一下
    2023-10-10

最新評論

泸水县| 沈阳市| 潼关县| 东城区| 衡阳市| 青铜峡市| 白水县| 河北区| 遂昌县| 铜陵市| 海原县| 双流县| 尖扎县| 莎车县| 璧山县| 无棣县| 金门县| 孙吴县| 虎林市| 临汾市| 临潭县| 曲水县| 颍上县| 临夏市| 聊城市| 兴和县| 彰化县| 依兰县| 日照市| 陵水| 成武县| 乃东县| 尚义县| 合肥市| 平原县| 拜城县| 晋城| 灵宝市| 道孚县| 吉林省| 偏关县|