生活随笔
收集整理的這篇文章主要介紹了
过滤器Filter总结+案例-实现敏感词汇过滤
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
過濾器Filter案例-實現敏感詞匯過濾
Filter概念: web中的過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
過濾器的作用:
一般用于完成通用的操作,如:登陸驗證,統一編碼處理、敏感字符過濾…等。Filter過濾器能夠在Servlet被調用之前檢查Request對象,并修改Request Header和Request內容;在Servlet被調用之后檢查Response對象,修改Response Header和Response的內容,實現多次過濾。Filter可以過濾的web組件包括Servlet,JSP和HTML等文件。
Filter的過濾原理
當瀏覽器向服務器發出資源的請求時,當瀏覽器滿足過濾條件時,Web服務器根據應用程序配置文件設置的過濾規則進行檢查。是一次雙向過濾的過程
過濾器生命周期方法
init()方法:在服務器啟動后,會創建filter對象,然后調用init方法。只執行一次,用于加載資源。
doFilter()方法:每一次請求被攔截資源時,會執行,執行多次。
destroy()方法:在服務器關閉后,filter對象會被銷毀,如果服務器時正常關閉,則會執行destroy方法,只執行一次,用于釋放資源。
過濾器鏈(配置多個過濾器)
執行順序:如果有兩個過濾器:過濾器1,過濾器2
過濾器1–>過濾器2–>資源執行–>(返回)–>過濾器2–>過濾1
過濾器先后順序問題:
注解配置:按照類名的字符串比較規則比較,值小的先執行。
如:Afilter 和 Bfilter,A<B A先執行
過濾器配置
攔截方式配置:dispatcherTypes 資源訪問的方式:
//假如時瀏覽器直接請求index.jsp路徑,那么將直接攔截,轉發到該路徑則不予阻攔
@WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)//釋放代碼chain.doFilter(req, resp);
案例敏感詞的過濾:
代理模式詳解圖:(靈魂畫手)、反正意思就似乎用上代理類,效率高,還能過濾掉敏感詞匯
為什么要用代理模式?
中介隔離作用:在某些情況下,一個客戶類不想或者不能直接引用一個委托對象,而代理類對象可以在客戶類和委托對象之間起到中介的作用,其特征是代理類和委托類實現相同的接口。
接下來就是實現代理模式
** public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {String name = req.getParameter("name");//動態代理增強,增強getParameter方法/* 三個參數:1. 類加載器:真實對象.getClass().getClassLoader()2. 接口數組:真實對象.getClass().getInterfaces()3. 處理器:new InvocationHandler()這邊的真實對象就是ServletRequest req的參數;*/ServletRequest ser = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/* 代理邏輯編寫的方法:代理對象調用的所有方法都會觸發該方法執行參數:1. proxy:代理對象2. method:代理對象調用的方法,被封裝為的對象3. args:代理對象調用的方法時,傳遞的實際參數*///判斷是不是getParameter方法if (method.getName().equals("getParameter")){//使用真實對象調用該方法String invoke = (String) method.invoke(req, args);//假如返回的值不為空,則進行敏感字符過濾if (invoke != null ){for (String s : list) {if (invoke.contains(s)){invoke = invoke.replaceAll(s,"***");}}}return invoke;}return method.invoke(req,args);}});String name1 = ser.getParameter("name");String rows = ser.getParameter("rows");System.out.println(rows);chain.doFilter(ser, resp);}//init方法在第一時間進行執行,并且只會執行一次。把每對敏感字符存入到list集合中private List<String> list = new ArrayList<>();@Overridepublic void init(FilterConfig config) throws ServletException {//獲取路徑try {ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("//WEB-INF//classes//敏感詞匯.txt");//防止亂碼 用InputStreamReade是從字節流到字符流的橋梁。BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"gbk"));String len = null;while ((len = bufr.readLine()) != null){list.add(len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}**
效果展示:
你是壞蛋,王八蛋
你是***,***
你是***,***
總結
以上是生活随笔為你收集整理的过滤器Filter总结+案例-实现敏感词汇过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。