一文詳解JavaWeb過(guò)濾器(Filter)
基本介紹
過(guò)濾器,顧名思義就是對(duì)事物進(jìn)行過(guò)濾的,在Web中的過(guò)濾器,當(dāng)然就是對(duì)請(qǐng)求進(jìn)行過(guò)濾,我們使用過(guò)濾器,就可以對(duì)請(qǐng)求進(jìn)行攔截,然后做相應(yīng)的處理,實(shí)現(xiàn)許多特殊功能。如登錄控制,權(quán)限管理,過(guò)濾敏感詞匯等.
過(guò)濾器原理
當(dāng)我們使用過(guò)濾器時(shí),過(guò)濾器會(huì)對(duì)游覽器的請(qǐng)求進(jìn)行過(guò)濾,過(guò)濾器可以動(dòng)態(tài)的分為3個(gè)部分,1.放行之前的代碼,2.放行,3.放行后的代碼,這3個(gè)部分分別會(huì)發(fā)揮不同作用。
- 第一部分代碼會(huì)對(duì)游覽器請(qǐng)求進(jìn)行第一次過(guò)濾,然后繼續(xù)執(zhí)行
- 第二部分代碼就是將游覽器請(qǐng)求放行,如果還有過(guò)濾器,那么就繼續(xù)交給下一個(gè)過(guò)濾器
- 第三部分代碼就是對(duì)返回的Web資源再次進(jìn)行過(guò)濾處理
我們使用過(guò)濾器,也就是說(shuō),不止請(qǐng)求會(huì)經(jīng)過(guò)過(guò)濾器,我們的響應(yīng)也會(huì)經(jīng)過(guò)過(guò)濾器。

過(guò)濾器(Filter)接口
我們學(xué)習(xí)過(guò)濾器,肯定就要先看一下官方給我們提供的過(guò)濾器接口。下面我們使用Idea來(lái)查看Filter。


我們通過(guò)官方提供的過(guò)濾器可以看出過(guò)濾器(Filter)使用起來(lái)還是比較簡(jiǎn)單的,下面我們就來(lái)學(xué)習(xí)如何使用過(guò)濾器(Filter)
使用過(guò)濾器(Filter)
我們使用過(guò)濾器肯定要導(dǎo)入相應(yīng)的jar包才行,F(xiàn)ilter就在servlet-api.jar中,我們將該jar包放到WEB-INF下的lib目錄下面,然后加入項(xiàng)目。
創(chuàng)建過(guò)濾器(Fliter)
我們創(chuàng)建Filter,只需要繼承Filter接口就行。
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
}Filter接口有3個(gè)方法,但是只有一個(gè)方法沒(méi)有實(shí)現(xiàn),我們只需要實(shí)現(xiàn)這個(gè)方法就行。我們可以發(fā)現(xiàn),我們實(shí)現(xiàn)了一個(gè)doFilter方法,這個(gè)方法就是我們寫過(guò)濾代碼的地方,具體邏輯就是和上面介紹的過(guò)濾器原理一樣的。
使用過(guò)濾器(Filter)
我們先來(lái)感受一下如何使用過(guò)濾器,細(xì)節(jié)我們后面慢慢說(shuō)明。我們?cè)谏厦鎰?chuàng)建的類中寫入以下代碼,并且加一個(gè)WebFIlter注解
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("對(duì)request進(jìn)行過(guò)濾");
//下面這行代碼就是放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("對(duì)response進(jìn)行過(guò)濾");
}
}我簡(jiǎn)單介紹下上面的代碼,WebFilter("/*")表示對(duì)所有請(qǐng)求進(jìn)行過(guò)濾,而在doFilter中的放行代碼,也就是filterChain.doFilter(servletRequest,servletResponse);這行代碼就是對(duì)攔截進(jìn)行放行,細(xì)節(jié)我們后面講,現(xiàn)在先怎么理解就行。
啟動(dòng)服務(wù)器,然后我們?cè)谟斡[器中輸入http://localhost:8080/filter/abc,注意,filter是我們自己配置的web工程路徑,后面的abc隨便輸入的。我們下面來(lái)查看游覽器后控制臺(tái)輸出。
游覽器輸出

控制臺(tái)輸出

現(xiàn)在,我們就已經(jīng)可以得出兩個(gè)結(jié)論了,過(guò)濾器并不會(huì)管資源是否存在,而只會(huì)對(duì)配置的攔截路徑進(jìn)行攔截。攔截不僅會(huì)對(duì)請(qǐng)求進(jìn)行攔截,而且還會(huì)對(duì)相應(yīng)進(jìn)行攔截。
配置過(guò)濾器(Filter)攔截路徑
配置Filter的攔截路徑有2種方式,一種是注解,一種是xml方式,我們分別進(jìn)行講解。
注解方式
我們?nèi)绻褂米⒔鈦?lái)進(jìn)行配置,那么我們就需要使用@WebFilter,我們不說(shuō)廢話,直接看該注解的源碼。

里面的配置項(xiàng)還是有很多的,下面我對(duì)常用配置項(xiàng)進(jìn)行說(shuō)明:
- filterName:該filter的名字
- initParams:初始化參數(shù)
- displayName:filter顯示名稱
- servletNames:指定對(duì)哪些servlet進(jìn)行過(guò)濾
- asyncSupported:是否支持異步模式
- urlPatterns:指定攔截路徑
- value:指定攔截路徑
注意:urlPatterns和value是一樣的。urlPatterns和value只能配置一個(gè),不能兩個(gè)都配置,兩個(gè)都配置就會(huì)報(bào)錯(cuò)。
對(duì)于使用@WebFilter,里面的多個(gè)參數(shù)用 , 進(jìn)行分隔。

說(shuō)明:如果我們僅僅需要配置一個(gè)攔截路徑,那么我們可以直接簡(jiǎn)寫@WebLister("攔截路徑"),如@WebFilter("/*")就是攔截所有請(qǐng)求。
xml方式
xml方式可以說(shuō)是和Servlet使用xml配置方式一樣了,這里就不廢話,直接配置一個(gè)。
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.clucky.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>這個(gè)就是xml配置方式,只不過(guò)把注解換成了xml標(biāo)簽來(lái)配置,里面屬性都是一樣的,這個(gè)和Servlet的配置方式基本一樣,這里就不再贅述了。
過(guò)濾器(Filter)生命周期
我們都知道Servlet有一個(gè)生命周期,當(dāng)然Filter也有一個(gè)生命周期,下面我們就來(lái)探討一下Filter的生命周期。
Filter的生命周期和Servlet也十分相似,如果大家對(duì)Servlet的生命周期不怎么熟悉,那么可以看一下這篇文章Servlet生命周期。
我們創(chuàng)建一個(gè)類,實(shí)現(xiàn)Filter的所有方法。
import javax.servlet.*;
import java.io.IOException;
public class LifeCycleFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}理論說(shuō)明
Filter有3個(gè)階段,分別是初始化,攔截和過(guò)濾,銷毀。
- 初始化階段:當(dāng)服務(wù)器啟動(dòng)時(shí),我們的服務(wù)器(Tomcat)就會(huì)讀取配置文件,掃描注解,然后來(lái)創(chuàng)建我們的Filter。
- 攔截和過(guò)濾階段:只要請(qǐng)求資源的路徑和攔截的路徑相同,那么過(guò)濾器就會(huì)對(duì)請(qǐng)求進(jìn)行過(guò)濾,這個(gè)階段在服務(wù)器運(yùn)行過(guò)程中會(huì)一直循環(huán)。
- 銷毀階段:當(dāng)服務(wù)器(Tomcat)關(guān)閉時(shí),服務(wù)器創(chuàng)建的Filter也會(huì)隨之銷毀。
代碼演示
Filter的三個(gè)階段就對(duì)應(yīng)著Filter的3個(gè)方法,init方法會(huì)在Filter創(chuàng)建時(shí)調(diào)用,doFilter方法會(huì)在請(qǐng)求和攔截匹配時(shí)調(diào)用,destroy方法會(huì)在Filter銷毀時(shí)調(diào)用。我們來(lái)對(duì)這些方法進(jìn)行編寫驗(yàn)證。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class LifeCycleFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//這個(gè)方法就是初始化方法,在Filter創(chuàng)建時(shí)調(diào)用
System.out.println("調(diào)用了init()方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//這個(gè)方法就是過(guò)濾和攔截的方法,當(dāng)請(qǐng)求和攔截匹配時(shí)調(diào)用
System.out.println("調(diào)用了doFilter()方法");
}
@Override
public void destroy() {
//這個(gè)方法就是銷毀方法,在Filter銷毀前調(diào)用
System.out.println("調(diào)用了destroy()方法");
}
}啟動(dòng)服務(wù)器控制臺(tái)輸出

進(jìn)行攔截時(shí)控制臺(tái)輸出

關(guān)閉服務(wù)器控制臺(tái)輸出

都和我們預(yù)想的一樣,到此,我們就成功驗(yàn)證了Filter的生命周期。
FilterConfig和FilterChain說(shuō)明
FilterConfig和FilterConfig這2個(gè)對(duì)象是由服務(wù)器(Tomcat)在創(chuàng)建和調(diào)用Filter對(duì)象時(shí)所傳入的,這2個(gè)對(duì)象十分有用,F(xiàn)ilterConfig對(duì)象可以讀取我們配置的初始參數(shù),F(xiàn)ilterChain可以實(shí)現(xiàn)多個(gè)Filter之間的連接。
FilterConfig
老規(guī)矩,我們要學(xué)習(xí)一個(gè)對(duì)象,首先查看類圖和源代碼


里面的方法就4個(gè),下面我們分別進(jìn)行講解
- getFilterName():獲取filter的名稱
- getServletContext():獲取ServletContext
- getInitparamter(String var1):獲取配置的初始參數(shù)的值
- getInitParamterNames():獲取配置的所有參數(shù)名稱
FilterConfig實(shí)例運(yùn)用
我們?cè)趇nit方法中使用FilterConfig來(lái)讀取配置的數(shù)據(jù)庫(kù)的信息,然后輸出。
java代碼
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class MyFilterConfig implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("-----------獲取全部key:value------------");
//得到所有配置參數(shù)的名字
Enumeration<String> names = filterConfig.getInitParameterNames();
while (names.hasMoreElements()) {
//得到每一個(gè)名字
String name = names.nextElement();
System.out.println(name+" = "+filterConfig.getInitParameter(name));
}
System.out.println("-----------end.....------------");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}xml配置
<filter>
<filter-name>myFilterConfig</filter-name>
<filter-class>com.clucky.filter.MyFilterConfig</filter-class>
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/equip_employ_manage?serverTimezone=GMT</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilterConfig</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>啟動(dòng)服務(wù)器,控制臺(tái)輸出

我們使用FilterConfig提供的方法就成功實(shí)現(xiàn)了功能,F(xiàn)ilterConfig就是用來(lái)讀取配置文件的。
FilterChain
一樣,我們還是先來(lái)查看源代碼以及類圖


我們查看類圖,可以發(fā)現(xiàn)FilterChain就只有一個(gè)方法,其實(shí)這個(gè)方法就是用來(lái)對(duì)攔截進(jìn)行放行的,如果有多個(gè)攔截器,那么就會(huì)繼續(xù)調(diào)用下一個(gè)Filter進(jìn)行攔截。doFilter方法需要傳入個(gè)參數(shù),一個(gè)是ServletRequest,一個(gè)是ServletResponse參數(shù),這個(gè)直接傳入進(jìn)行。
Tomcat在調(diào)用過(guò)濾器時(shí),默認(rèn)就會(huì)傳入Request和Response,這個(gè)參數(shù)封裝了請(qǐng)求和響應(yīng),我們直接使用就行。ServletResquest和ServletResponse可以直接強(qiáng)轉(zhuǎn)成HttpServletRequest和HttpServletResponse,然后使用相應(yīng)的方法。
將ServletRequest轉(zhuǎn)成HttpServletRequest

FilterChain應(yīng)用實(shí)例
我們前面一直都是一個(gè)Filter,現(xiàn)在我們來(lái)配置2個(gè)Filter,通過(guò)FilterChain來(lái)進(jìn)行多個(gè)過(guò)濾。
第一個(gè)Filter
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("調(diào)用過(guò)濾器01對(duì)請(qǐng)求進(jìn)行過(guò)濾~~~~");
//放行,如果還有過(guò)濾器,那么就執(zhí)行下一個(gè)過(guò)濾器
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("調(diào)用過(guò)濾器01對(duì)響應(yīng)進(jìn)行過(guò)濾~~~~");
}
@Override
public void destroy() {
}
}第二個(gè)過(guò)濾器
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("調(diào)用過(guò)濾器02對(duì)請(qǐng)求進(jìn)行過(guò)濾~~~~");
//放行,如果還有過(guò)濾器,那么就執(zhí)行下一個(gè)過(guò)濾器
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("調(diào)用過(guò)濾器02對(duì)響應(yīng)進(jìn)行過(guò)濾~~~~");
}
@Override
public void destroy() {
}
}啟動(dòng)服務(wù)器,然后我們游覽器輸入http://localhost:8080/filter/abc(filter是我配置的web工程路徑)來(lái)進(jìn)行訪問(wèn),查看控制臺(tái)輸出。

我們可以看見(jiàn)Filter01先進(jìn)行過(guò)濾,然后交給Filter02,然后訪問(wèn)資源,然后Filter02對(duì)響應(yīng)進(jìn)行過(guò)濾,然后Filter01對(duì)響應(yīng)進(jìn)行過(guò)濾。圖示如下:

我們先使用Filter01對(duì)請(qǐng)求進(jìn)行過(guò)濾,那么很自然的,我們就是使用Filter02先對(duì)響應(yīng)進(jìn)行過(guò)濾。
多個(gè)Filter的執(zhí)行順序
上面我們配置了2個(gè)過(guò)濾器,那么我們?cè)趺粗滥莻€(gè)過(guò)濾器先執(zhí)行呢?其實(shí)大家可以直接使用代碼進(jìn)行驗(yàn)證,培養(yǎng)獨(dú)立思考的習(xí)慣,這里我就直接給出答案了。
- 如果我們是在web.xml中配置的過(guò)濾器,那么過(guò)濾器的執(zhí)行順序就是<filter-mapping>在web配置的順序,配置在上面那么就會(huì)先執(zhí)行。
- 如果我們是使用@WebFilter進(jìn)行配置的,那么執(zhí)行順序就是字符比較順序來(lái)執(zhí)行,例如有2個(gè)過(guò)濾器,一個(gè)是AFilter,一個(gè)是BFilter,那么AFilter就會(huì)先執(zhí)行。
- 如果注解和xml混用,那么在web.xml中配置的會(huì)先執(zhí)行。
執(zhí)行順序驗(yàn)證
我這里就驗(yàn)證第一條,也就是web.xml中配置的順序和<filter-mapping>順序一樣,其他大家感興趣自己驗(yàn)證。
xml配置順序 3->1->2
<filter>
<filter-name>filter03</filter-name>
<filter-class>com.clucky.filter.Filter03</filter-class>
</filter>
<filter-mapping>
<filter-name>filter03</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>filter01</filter-name>
<filter-class>com.clucky.filter.Filter01</filter-class>
</filter>
<filter-mapping>
<filter-name>filter01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>filter02</filter-name>
<filter-class>com.clucky.filter.Filter02</filter-class>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>Filter01
import javax.servlet.*;
import java.io.IOException;
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("調(diào)用過(guò)濾器01對(duì)請(qǐng)求進(jìn)行過(guò)濾~~~~");
//放行,如果還有過(guò)濾器,那么就執(zhí)行下一個(gè)過(guò)濾器
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("調(diào)用過(guò)濾器01對(duì)響應(yīng)進(jìn)行過(guò)濾~~~~");
}
@Override
public void destroy() {
}
}Filter02
import javax.servlet.*;
import java.io.IOException;
public class Filter02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("調(diào)用過(guò)濾器02對(duì)請(qǐng)求進(jìn)行過(guò)濾~~~~");
//放行,如果還有過(guò)濾器,那么就執(zhí)行下一個(gè)過(guò)濾器
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("調(diào)用過(guò)濾器02對(duì)響應(yīng)進(jìn)行過(guò)濾~~~~");
}
@Override
public void destroy() {
}
}Filter03
import javax.servlet.*;
import java.io.IOException;
public class Filter03 implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("調(diào)用過(guò)濾器03對(duì)請(qǐng)求進(jìn)行過(guò)濾~~~~");
//放行,如果還有過(guò)濾器,那么就執(zhí)行下一個(gè)過(guò)濾器
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("調(diào)用過(guò)濾器03對(duì)響應(yīng)進(jìn)行過(guò)濾~~~~");
}
@Override
public void destroy() {
}
}我們啟動(dòng)服務(wù)器,游覽器訪問(wèn),然后查看控制臺(tái)輸出是不是我們配置的3->1->2的順序

發(fā)現(xiàn)執(zhí)行順序果然是這樣,另外2個(gè)的驗(yàn)證大家感興趣可以自己驗(yàn)證,我這里就不驗(yàn)證了,如果嫌麻煩,那么記住就行了。
Filter應(yīng)用實(shí)例(實(shí)現(xiàn)敏感詞匯過(guò)濾)
我們學(xué)了那么多,現(xiàn)在來(lái)做一個(gè)實(shí)例,我們寫一個(gè)評(píng)論頁(yè)面,可以進(jìn)行評(píng)論,如果評(píng)論中含有我們定義的敏感詞匯,那么我們就進(jìn)行過(guò)濾,使用**來(lái)進(jìn)行代替。
代碼實(shí)現(xiàn)
jsp頁(yè)面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>評(píng)論</title>
</head>
<body>
<h1>輸入評(píng)論內(nèi)容</h1>
<form action="${pageContext.request.contextPath}/comment" method="post">
<textarea name="message" cols="30" rows="10"></textarea>
<input type="submit" value="提交">
</form>
<p >${requestScope.get("name")}<span style="color: red">${requestScope.get("comment")}</span></p>
</body>
</html>Filter代碼
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebFilter(servletNames = {"comment"},initParams = {@WebInitParam(name = "sensitiveWord", value = "zz")})
public class CommentFilter implements Filter {
private List<String> sensitiveWords = new ArrayList<>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//得到敏感詞匯
String word = filterConfig.getInitParameter("sensitiveWord");
//加入集合
sensitiveWords.add(word);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//設(shè)置編碼
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
//得到評(píng)論
String message = servletRequest.getParameter("message");
for (String sensitiveWord : sensitiveWords) {
//對(duì)所有敏感詞匯進(jìn)行過(guò)濾
if (message.contains(sensitiveWord)){
//替換敏感詞匯
message = message.replace(sensitiveWord, "**");
}
}
//存入request域
servletRequest.setAttribute("comment",message);
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}Servlet代碼
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.HashSet;
@WebServlet(name = "comment",value = "/comment")
public class CommentServlet extends HttpServlet {
//記錄評(píng)論敏感詞匯的ip
private HashSet<String> hashSet = new HashSet<>();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String message = request.getParameter("message");
String comment = (String) request.getAttribute("comment");
if (message.equals(comment)){
System.out.println("沒(méi)有敏感詞匯.....");
//設(shè)置名字
request.setAttribute("name","good boy:");
}else {
//有敏感詞匯,記錄IP
String localAddr = request.getLocalAddr();
System.out.println(localAddr);
hashSet.add(localAddr);
//設(shè)置名字
request.setAttribute("name","bad boy:");
}
//轉(zhuǎn)發(fā)到comment.jsp頁(yè)面
request.getRequestDispatcher("/comment.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}代碼驗(yàn)證
我們輸入http://localhost:8080/filter/comment.jsp,來(lái)訪問(wèn)jsp頁(yè)面.

輸入評(píng)論內(nèi)容:你好?。?!!

下面顯示了我們的評(píng)論,我們?cè)賮?lái)輸入:你真是個(gè)zz

顯示你真是個(gè)**,我們的評(píng)論過(guò)濾就成功了。
總結(jié)
到此這篇關(guān)于一文詳解JavaWeb過(guò)濾器(Filter)的文章就介紹到這了,更多相關(guān)Java 過(guò)濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家
- JavaWeb的監(jiān)聽(tīng)器和過(guò)濾器你了解嗎
- 詳解JavaWeb過(guò)濾器 Filter問(wèn)題解決
- JavaWeb中過(guò)濾器Filter的用法詳解
- JavaWeb之監(jiān)聽(tīng)器案例講解
- Javaweb監(jiān)聽(tīng)器實(shí)例之統(tǒng)計(jì)在線人數(shù)
- 快速學(xué)習(xí)JavaWeb中監(jiān)聽(tīng)器(Listener)的使用方法
- 深入學(xué)習(xí)JavaWeb中監(jiān)聽(tīng)器(Listener)的使用方法
- 深入理解JavaWeb中過(guò)濾器與監(jiān)聽(tīng)器的應(yīng)用
相關(guān)文章
tomcat connection-timeout連接超時(shí)源碼解析
這篇文章主要為大家介紹了tomcat connection-timeout連接超時(shí)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
java之a(chǎn)ssert關(guān)鍵字用法案例詳解
這篇文章主要介紹了java之a(chǎn)ssert關(guān)鍵字用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
springboot中通過(guò)lua腳本來(lái)獲取序列號(hào)的方法
這篇文章主要介紹了springboot中通過(guò)lua腳本來(lái)獲取序列號(hào)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
解決springboot使用logback日志出現(xiàn)LOG_PATH_IS_UNDEFINED文件夾的問(wèn)題
這篇文章主要介紹了解決springboot使用logback日志出現(xiàn)LOG_PATH_IS_UNDEFINED文件夾的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
解決springboot啟動(dòng)失敗的問(wèn)題('hibernate.dialect'?not?set)
這篇文章主要介紹了解決springboot啟動(dòng)失敗的問(wèn)題('hibernate.dialect'?not?set),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java基于JavaMail實(shí)現(xiàn)向QQ郵箱發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了Java基于JavaMail實(shí)現(xiàn)向QQ郵箱發(fā)送郵件的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
Springboot Activemq整合過(guò)程代碼圖解
這篇文章主要介紹了Springboot Activemq整合過(guò)程代碼圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

