日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet规范中定义的过滤器

發(fā)布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet规范中定义的过滤器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 什么是過濾器
  • 寫過濾器的步驟
  • 配置初始化參數
  • 過濾器的優(yōu)先級
  • 過濾器的優(yōu)點
  • 過濾器執(zhí)行過程圖解
  • 過濾敏感詞的示例代碼
    • 使用 Servlet 來過濾敏感詞
    • 使用過濾器來過濾敏感詞
    • 通過配置初始化參數來設置敏感詞
  • 關于 web.xml 的配置

什么是過濾器

Servlet 規(guī)范當中定義的一種特殊的類,用于對 Servlet 容器的調用過程進行攔截。

寫過濾器的步驟

step1
寫一個 java 類,實現一個 Filter 接口。
step2
在 doFilter 方法里,實現過濾的邏輯。
step3
配置(web.xml)。

配置初始化參數

step1
web.xml 中,使用 <init-para> 元素來配置初始化參數
step2
在 Filter 類中,使用 FilterConfig.getInitParameter(String paraName); 獲得初始化參數。

過濾器的優(yōu)先級

當有多個過濾器都滿足過濾的條件時,依據 <filter-mapping> 的先后順序依次執(zhí)行。

過濾器的優(yōu)點

a. 可以將多個 web 組件相同的邏輯寫在一個過濾器當中,方便代碼的維護
b. 可實現代碼的“可插拔性"。
給一個軟件增加戒者減少某個功能不會影響已經存在的功能。

過濾器執(zhí)行過程圖解

  • 瀏覽器發(fā)送請求給服務器
  • 服務器的 Servlet 引擎創(chuàng)建 Request 對象&&Response 對象
  • Servlet 引擎先調用過濾器的 doFilter 方法,該方法有兩個參數 request 和 response,
    (在過濾器中可以訪問到 Request 對象&&Response 對象)
  • 過濾器對攔截的內容迚行處理
  • 之后調用 SomeServlet 的 service 方法
  • service 方法執(zhí)行
  • service 方法執(zhí)行結束后,將結果返回到過濾器
  • 過濾器將 service 方法返回的結果再次進行過濾
  • 最后,Servlet 引擎將結果返回給瀏覽器
  • 過濾敏感詞的示例代碼

    使用 Servlet 來過濾敏感詞

    實現敏感詞過濾功能,如果沒有使用過濾器,我們使用 Servlet 來實現。

    JSP 頁面代碼:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body style="font-size: 30px;"> <form action="process" method="post">input your comment:<input type="text" name="comment"/><input type="submit" value="提交"/> </form> </body> </html>

    Servlet 代碼:

    package priv.lwx.servlet.filter.web;import org.junit.jupiter.api.Test;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; import java.io.PrintWriter;/*** description** @author liaowenxiong* @date 2022/2/23 22:40*/ @WebServlet("/process") public class ProcessServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();String comment = req.getParameter("comment");if (comment.indexOf("dog") >= 0) {out.println("含有違禁關鍵字");} else {out.println("你的評論是:" + comment);}out.close();}@Testpublic void test() {System.out.println("dog".indexOf("dog"));} }

    使用過濾器來過濾敏感詞

    Filter 的代碼如下:

    package priv.lwx.servlet.filter; /*** 評論敏感詞過濾器** @author liaowenxiong* @date 2022/2/23 23:14*/import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; import java.io.PrintWriter;@WebFilter("/process") public class CommentFilter implements Filter {/*** Servlet 容器在創(chuàng)建好 Filter 實例之后,會立即創(chuàng)建* FilterConfig 實例并調用 init()方法,將 FilterConfig* 實例作為參數傳遞過去。通過該實例,可以訪問 Filter 的初始化參數。* String FilterConfig.getInitParameter(String paraName);* init()方法只會執(zhí)行一次。** @param config* @throws ServletException*/public void init(FilterConfig config) throws ServletException {System.out.println("init...");}/*** 在容器刪除Filter實例之前,調用該方法。* 只會執(zhí)行一次。*/public void destroy() {System.out.println("destroy...");}/*** 當請求到達容器,容器會調用 doFilter 方法。* 容器會將事先創(chuàng)建好的 request,response 對象作為* 參數傳遞過去。* FilterChain:過濾器鏈。* 如果調用了 FilterChain.doFilter 方法,表示調用* 后續(xù)的過濾器。如果沒有過濾器了,則調用對應的 web 組件。** @param request* @param response* @param chain* @throws ServletException* @throws IOException*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {request.setCharacterEncoding("utf8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String comment = request.getParameter("comment");if (comment.indexOf("dog") >= 0) {out.println("評論中含有敏感詞!");} else {// 調用后續(xù)的過濾器,如果沒有了,則調用Web組件chain.doFilter(request, response);}}}

    注意點:過濾器的請求路徑(即url-pattern)必須與web組件(Servlet)的url-pattern相同。

    Servlet 的代碼如下:

    package priv.lwx.servlet.filter.web;import org.junit.jupiter.api.Test;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; import java.io.PrintWriter;/*** description** @author liaowenxiong* @date 2022/2/23 22:40*/ @WebServlet("/process") public class ProcessServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();String comment = req.getParameter("comment");out.println("你的評論是:" + comment);out.close();}@Testpublic void test() {System.out.println("dog".indexOf("dog"));} }

    通過配置初始化參數來設置敏感詞

    Filter 的示例代碼:

    package priv.lwx.servlet.filter; /*** 評論敏感詞過濾器** @author liaowenxiong* @date 2022/2/23 23:14*/import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration;@WebFilter(value = "/process", initParams = {@WebInitParam(name = "illegalStr0",value = "dog"), @WebInitParam(name = "illegalStr1", value = "pig")}) public class CommentFilter implements Filter {private FilterConfig config;/*** Servlet 容器在創(chuàng)建好 Filter 實例之后,會立即創(chuàng)建* FilterConfig 實例并調用 init()方法,將 FilterConfig* 實例作為參數傳遞過去。通過該實例,可以訪問 Filter 的初始化參數。* String FilterConfig.getInitParameter(String paraName);* init()方法只會執(zhí)行一次。** @param config* @throws ServletException*/public void init(FilterConfig config) throws ServletException {System.out.println("init...");config = config;}/*** 在容器刪除Filter實例之前,調用該方法。* 只會執(zhí)行一次。*/public void destroy() {System.out.println("destroy...");}/*** 當請求到達容器,容器會調用 doFilter 方法。* 容器會將事先創(chuàng)建好的 request,response 對象作為* 參數傳遞過去。* FilterChain:過濾器鏈。* 如果調用了 FilterChain.doFilter 方法,表示調用* 后續(xù)的過濾器。如果沒有過濾器了,則調用對應的 web 組件。** @param request* @param response* @param chain* @throws ServletException* @throws IOException*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {request.setCharacterEncoding("utf8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String comment = request.getParameter("comment");Enumeration<String> initParameterNames = config.getInitParameterNames();// 是否含有敏感詞,默認無boolean isIllegal = false;while (initParameterNames.hasMoreElements()) {String initParameterName = initParameterNames.nextElement();String initParameter = config.getInitParameter(initParameterName);if (comment.indexOf(initParameter) >= 0) {// 含有敏感詞isIllegal = true;out.println("評論中含有敏感詞:" + initParameter);break;}}if (!isIllegal) {// 沒有敏感詞,則調用后續(xù)的過濾器,如果沒有過濾器,則調用Web組件chain.doFilter(request, response);}}}

    注意點:注解 WebFilter 的 屬性 initParams,其值是一個注解數組,即數組元素的類型就是 @WebInitParam,或者說數組元素是 @WebInitParam 的實例對象。

    賦值示例代碼如下:

    initParams = {@WebInitParam(name = "illegalStr0",value = "dog"), @WebInitParam(name = "illegalStr1", value = "pig")}

    解讀:
    注解 WebInitParam 用來封裝參數,方法 initParams 用來從 WebInitParam 對象獲取參數,再將參數封裝到 Request 對象中。

    Servlet 的示例代碼:

    package priv.lwx.servlet.filter.web;import org.junit.jupiter.api.Test;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; import java.io.PrintWriter;/*** description** @author liaowenxiong* @date 2022/2/23 22:40*/ @WebServlet("/process") public class ProcessServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();String comment = req.getParameter("comment");out.println("你的評論是:" + comment);out.close();}@Testpublic void test() {System.out.println("dog".indexOf("dog"));} }

    關于 web.xml 的配置

    上面的示例并沒有在 web.xml 文件中對 Servlet、Filter 進行配置,采用的都是注解配置。如果要在 web.xml 配置 Servlet、Filter 請參考下面的配置內容:

    <?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>filter1</filter-name><filter-class>priv.lwx.servlet.filter.CommentFilter</filter-class><init-param><param-name>illegalStr0</param-name><param-value>dog</param-value></init-param><init-param><param-name>illegalStr1</param-name><param-value>pig</param-value></init-param></filter><filter-mapping><filter-name>filter1</filter-name><url-pattern>/process</url-pattern></filter-mapping><servlet><servlet-name>process</servlet-name><servlet-class>priv.lwx.servlet.filter.web.ProcessServlet</servlet-class></servlet><servlet-mapping><servlet-name>process</servlet-name><url-pattern>/process</url-pattern></servlet-mapping> </web-app>

    總結

    以上是生活随笔為你收集整理的Servlet规范中定义的过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。