亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaWeb之Filter過濾器詳解

 更新時間:2017年03月16日 08:21:12   作者:社會主義接班人  
本篇文章主要介紹了JavaWeb之Filter過濾器詳解,實例分析了JavaWeb之Filter過濾器的使用技巧,非常具有實用價值,需要的朋友可以參考下。

原本計劃這一篇來總結(jié)JSP,由于JSP的內(nèi)容比較多,又想著晚上跑跑步減減肥,所以今天先介紹Filter以及它的使用舉例,這樣的話還有些時間可以鍛煉鍛煉。言歸正傳,過濾器從字面理解她的話有攔網(wǎng)、過濾的功能,可以算是JavaWeb的攔精靈。

一、由來

客戶端發(fā)起請求,那服務(wù)器不能什么請求都做出響應(yīng),做攔截處理,不僅能減輕服務(wù)器的壓力,還能保護數(shù)據(jù)的安全,同樣服務(wù)端做出響應(yīng)給客戶端時有時也需要進(jìn)行過濾,比如我們常見的圖片添加水印。為了處理這些問題,于是過濾器出現(xiàn)了。有時不僅僅對請求與響應(yīng)進(jìn)行一層的過濾,可能會過濾多層,所以提出了濾鏡鏈(FilterChain)的概念.

二、使用

在使用它之前先熟悉下它的作用的地方。過濾器作用在請求Request到達(dá)Servlet之前以及響應(yīng)Response到達(dá)瀏覽器之前會依次經(jīng)過過慮鏈。有些類似asp.net中的httpmodule.使用Filter主要是實現(xiàn)javax.servlet.filter接口。查看API可看到有3個方法。

1.public void init(FilterConfig filterConfig) throws ServletException

由 Web 容器調(diào)用,指示將放入服務(wù)中的過濾器。servlet 容器只在實例化過濾器之后調(diào)用一次 init 方法。在要求過濾器做任何過濾工作之前,init 方法必須成功完成。如果 init 方法拋出 ServletException或沒有在 Web 容器定義的時間段內(nèi)返回,則 Web 容器無法將過濾器放入服務(wù)中。這個和Servlet的生命周期有點類似,也是只初始化一次,destroy()也是執(zhí)行一次。

2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException

每次由于對鏈末尾的某個資源的客戶端請求而通過鏈傳遞請求/響應(yīng)對時,容器都會調(diào)用 Filter 的 doFilter 方法。傳入此方法的 FilterChain 允許 Filter 將請求和響應(yīng)傳遞到鏈中的下一個實體。
此方法的典型實現(xiàn)遵循以下模式:

1. 檢查請求

2. 有選擇地將帶有自定義實現(xiàn)的請求對象包裝到用于輸入過濾的過濾器內(nèi)容或頭中

3. 有選擇地將帶有自定義實現(xiàn)的響應(yīng)對象包裝到用于輸出過濾的過濾器內(nèi)容或頭中

4. a) 既可以使用 FilterChain 對象 (chain.doFilter()) 調(diào)用鏈中的下一個實體,

4. b) 也可以不將請求/響應(yīng)對傳遞給過濾器鏈中的下一個實體,從而阻塞請求處理

5. 在調(diào)用過濾器鏈中的下一個實體之后直接設(shè)置響應(yīng)上的頭。

3.public void destroy()

由 Web 容器調(diào)用,指示將從服務(wù)中取出的過濾器。此方法僅在過濾器的 doFilter 方法中的所有線程都已退出之后調(diào)用一次,或者在過了超時期之后調(diào)用。在調(diào)用此方法之后,Web 容器不會再對此過濾器實例調(diào)用 doFilter 方法。此方法為過濾器提供了一個清除持有的所有資源(比如內(nèi)存、文件句柄和線程)的機會,并確保任何持久狀態(tài)都與內(nèi)存中該過濾器的當(dāng)前狀態(tài)保持同步。

三、案例

使用過濾器的地方有很多,這里就不一一舉例,下面的demo在上篇博客中HelloWorld項目的基礎(chǔ)上實現(xiàn)防盜鏈的功能,以此體會Filter的使用。

1.準(zhǔn)備

在HelloWolrd項目中新增一個文件夾,在文件夾中放入兩個圖片一個err.png 一個test.png,兩個圖如下

2.創(chuàng)建Filter

這里也沒新建Filter包,直接在上一博客中的com.test.cyw包中創(chuàng)建Filter文件MyFilter,應(yīng)該是創(chuàng)建一個包專門管理Filter類的額,這里只是做測試。創(chuàng)建完成之后可以看到MyFilter繼承Filter。

 public class MyFilter implements Filter 

3.在doFilter中實現(xiàn)防盜鏈

package com.test.cyw;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.*;

/*@WebFilter("/MyFilter")*/
public class MyFilter implements Filter {

  public MyFilter() {
    
  }

  public void destroy() {
    
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    HttpServletRequest req=(HttpServletRequest)request;
    HttpServletResponse res=(HttpServletResponse)response;
    String referer=req.getHeader("referer");//鏈接來源地址
    if(referer==null||!referer.contains(req.getServerName()))
    {
      req.getRequestDispatcher("/Images/err.png").forward(req, res);
      return;
    }
    chain.doFilter(req, res);
  }

  public void init(FilterConfig fConfig) throws ServletException {
    
  }
}

4.Filter配置

上面只是創(chuàng)建了一個類實現(xiàn)了Filter接口,如何讓Tomcat知道呢,這和Servlet類似,需要在Web.xml中配置。和配置servlet有點相同。

  <filter>
   <filter-name>MyFilter</filter-name>
   <filter-class>com.test.cyw.MyFilter</filter-class>
 </filter>
 <filter-mapping>
   <filter-name>MyFilter</filter-name>
   <url-pattern>/Images/*</url-pattern>
 </filter-mapping>

5.測試

新建一個test.jsp文件,在jsp中顯示img,可以正常顯示

 <%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="防盜鏈" src="Images/test.png" width="400">
</body>
</html>

如果直接在瀏覽器輸入test.png的地址,則會顯示err.png

四、遇到的問題

開始的時候由于地址錯誤,導(dǎo)致谷歌瀏覽器test.jsp中顯示的也是err.png的圖片,但當(dāng)我換過來時刷新頁面還是沒變,這個讓我很納悶。有時候?qū)omca重啟也不行,試了好幾次都是這樣,實在不行了用IE試了下沒想到顯示是正確的,原來谷歌瀏覽器有緩存,導(dǎo)致顯示的不正確。

五、總結(jié)

Filter用處很多,網(wǎng)上也有好多的例子,做項目時可以先實現(xiàn)一些常用的例如水印,等用的時候只需配置下xml就能解決,很是方便。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java基于注解實現(xiàn)的鎖實例解析

    Java基于注解實現(xiàn)的鎖實例解析

    這篇文章主要介紹了Java基于注解實現(xiàn)的鎖實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • java獲取兩個List集合的交集代碼示例

    java獲取兩個List集合的交集代碼示例

    這篇文章主要給大家介紹了關(guān)于java獲取兩個List集合交集的相關(guān)資料,我們可以使用Stream操作來對集合進(jìn)行一系列的操作,其中包括求交集,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java中對象快速復(fù)制的幾種方式詳解

    Java中對象快速復(fù)制的幾種方式詳解

    這篇文章主要介紹了Java中對象快速復(fù)制的幾種方式詳解,對象的克隆是指創(chuàng)建一個新的對象,且新的對象的狀態(tài)與原始對象的狀態(tài)相同,當(dāng)對克隆的新對象進(jìn)行修改時,不會影響原始對象的狀態(tài),需要的朋友可以參考下
    2023-08-08
  • java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用過程詳解

    java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用過程詳解

    這篇文章主要為大家介紹了java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • java教程之java注解annotation使用方法

    java教程之java注解annotation使用方法

    這篇文章主要介紹了java注解annotation使用方法,注解可以定義到方法上,類上,一個注解相當(dāng)與一個類,就相當(dāng)于實例了一個對象,加上了注解,就相當(dāng)于加了一個標(biāo)志
    2014-01-01
  • SpringMVC的概念以及快速入門示例

    SpringMVC的概念以及快速入門示例

    這篇文章主要介紹了SpringMVC的概念以及快速入門示例,SpringMVC 已經(jīng)成為目前最主流的MVC框架之一,它通過一套注解,讓一個簡單的 Java 類成為處理請求的控制器,而無須實現(xiàn)任何接口,需要的朋友可以參考下
    2023-05-05
  • Java8 Optional的詳細(xì)使用教程

    Java8 Optional的詳細(xì)使用教程

    這篇文章主要給大家介紹了關(guān)于Java8 Optional的詳細(xì)使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java虛擬機JVM性能優(yōu)化(二):編譯器

    Java虛擬機JVM性能優(yōu)化(二):編譯器

    這篇文章主要介紹了Java虛擬機JVM性能優(yōu)化(二):編譯器,本文先是講解了不同種類的編譯器,并對客戶端編譯,服務(wù)器端編譯器和多層編譯的運行性能進(jìn)行了對比,然后給出了幾種常見的JVM優(yōu)化方法,需要的朋友可以參考下
    2014-09-09
  • 談?wù)剬ava中的volatile的理解

    談?wù)剬ava中的volatile的理解

    這篇文章主要介紹了對Java中的volatile的理解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • mybatis中注解與xml配置的對應(yīng)關(guān)系和對比分析

    mybatis中注解與xml配置的對應(yīng)關(guān)系和對比分析

    這篇文章主要介紹了mybatis中注解與xml配置的對應(yīng)關(guān)系和對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論