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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

过滤器filter,监听器listener

發(fā)布時(shí)間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 过滤器filter,监听器listener 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 1. filter過濾器
    • 1.1 原理
    • 1.2 配置
    • 1.3 過濾掉臟話demo
  • 2. listener監(jiān)聽器
    • 2.1 作用
    • 2.2 ServletContextListener demo

1. filter過濾器

  • 作用:
  • 過濾servlet,jsp,js,css,圖片對(duì)象,以及一切在服務(wù)器,客戶端想訪問的對(duì)象
  • 用來設(shè)置編碼,過濾掉臟話等…
  • 過濾器鏈:你有多個(gè)過濾器,你如果多個(gè)filter過濾一個(gè)servlet,配置一個(gè)servlet,那么這個(gè)多個(gè)過濾器會(huì)形成過濾器鏈。

1.1 原理

  • 不多bb,請(qǐng)看下面的圖

  • 就像學(xué)校的圖書館,你進(jìn)學(xué)校有保安守著校門,這是一次過濾,進(jìn)學(xué)校圖書館,你得刷卡,才可自習(xí)。只是過濾器可以配置多個(gè),對(duì)不同得對(duì)象…

1.2 配置

  • 比如我想創(chuàng)建一個(gè)過濾掉臟話的過濾器叫FilterDirtyTalk
  • 對(duì)DirtyMsg servlet進(jìn)行過濾
<filter><filter-name>FilterDirtyTalk</filter-name><filter-class>filter.FilterDirtyTalk</filter-class><!-- 與servlet配置相似 --></filter><filter-mapping><filter-name>FilterDirtyTalk</filter-name><url-pattern>/DirtyMsg</url-pattern> <!-- 想進(jìn)入dirtymsg servlet 得先經(jīng)過filter --></filter-mapping>
  • 但是上面的servlet只能過濾從jsp進(jìn)來的 !假如,你有業(yè)務(wù),從一個(gè)servlet轉(zhuǎn)發(fā)到j(luò)sp后臺(tái)頁面,但是這個(gè)頁面要登錄才行。你沒登錄,按上面的配置,過濾器過濾不到,所以來了解過濾器的規(guī)則。

  • 過濾器過濾規(guī)則

FORWARD:轉(zhuǎn)發(fā)時(shí)進(jìn)行過濾
REQUEST:瀏覽器直接請(qǐng)求時(shí)進(jìn)行過濾(默認(rèn):沒有配置dispatcher節(jié)點(diǎn)的時(shí)候)
INCLUDE:動(dòng)態(tài)包含的時(shí)候執(zhí)行過濾器
<%@ include %>:靜態(tài)包含,把被包含的頁面的源代碼拷貝過來與包含頁面一起轉(zhuǎn)譯編譯運(yùn)行;包含的過程中不能傳參
jsp:include動(dòng)態(tài)包含:包含頁面和被包含頁面分開轉(zhuǎn)譯編譯運(yùn)行,然后將結(jié)果合并到一起;包含的過程中可以傳參
ERROR:在出錯(cuò)的時(shí)候進(jìn)入過濾器

  • 在web.xml <filter-mapping>加上
<dispatcher>REQUEST</dispatcher> <!-- 默認(rèn)對(duì)請(qǐng)求進(jìn)行過濾 --><dispatcher>FORWARD</dispatcher> <!-- 會(huì)檢查請(qǐng)求轉(zhuǎn)發(fā)-->

1.3 過濾掉臟話demo

  • 過濾掉臟話filter_config.txt 文本文件
你妹=妹妹 你弟=弟弟 你媽=媽媽
  • 拿到request對(duì)象中的用戶請(qǐng)求數(shù)據(jù),繼承HttpServletRequestWrapper
package servlet;import java.util.Map;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper;public class MyRequest extends HttpServletRequestWrapper {private Map<String, String[]> map;public MyRequest(HttpServletRequest request) {super(request);map = request.getParameterMap(); }@Overridepublic String getParameter(String name) {// 返回第一個(gè)值String[] str = map.get(name);if (str.length > 0 && str != null)return str[0];return null;}@Overridepublic Map<String, String[]> getParameterMap() {// 返回mapreturn map;}@Overridepublic String[] getParameterValues(String name) {// string數(shù)組值return map.get(name);}}
  • 把臟話轉(zhuǎn)成civilized word
package filter;import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set;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.http.HttpServletRequest;import servlet.MyRequest;public class FilterDirtyTalk implements Filter {@Overridepublic void destroy() {// 過濾掉 你妹,你媽,你弟等 -> 你妹=妹妹 // tomcat8.0 給你的版本map是副本, 重寫HttpServletRequestWrapper 重新拿到map的值 ... }@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest hreq = (HttpServletRequest) req;// 把請(qǐng)求改變?yōu)槲业恼?qǐng)求類,里面正真的改變了map集合req = new MyRequest(hreq);if (hreq.getMethod().equalsIgnoreCase("get")) { // get方式// tomcat 8.0 已經(jīng)設(shè)置好了get編碼} else if (hreq.getMethod().equalsIgnoreCase("post")) {req.setCharacterEncoding("utf-8");}resp.setContentType("text/html;charset=utf-8");File file = new File("E:\\servletStudy\\Servlet3\\filter_config.txt");// 讀取臟話FileReader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);HashMap<String, String> dirtyMap = new HashMap<String, String>();// 改變value的值 如果是dirty-talk// 讀取filter-configString str = br.readLine();while (str != null) {dirtyMap.put(str.split("=")[0], str.split("=")[1]);str = br.readLine();} // 把臟話放入集合。。。Set<Entry<String, String>> dirtySet = dirtyMap.entrySet();// 請(qǐng)求對(duì)象鍵值對(duì)Map<String, String[]> map = req.getParameterMap();Set<Entry<String,String[]>> entrySet = map.entrySet();for (Entry<String, String[]> entry : entrySet) {String key = entry.getKey(); // 請(qǐng)求對(duì)象參數(shù)String[] value = entry.getValue(); // 請(qǐng)求對(duì)象值System.out.println(key + "\t" + Arrays.toString(value));for (int i = 0; i < value.length; i++) {for(Entry<String, String> set : dirtySet) {String dirty = set.getKey();if (dirty.equals(value[i]))value[i] = set.getValue();}}System.out.println("轉(zhuǎn)換后");System.out.println(key + "\t" + Arrays.toString(value));}br.close();fr.close();// 放行 jsp才可訪問servlet...chain.doFilter(req, resp);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}}
  • DirtyMsg 拿到j(luò)sp頁面過濾的值
package servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class DirtyMsg extends HttpServlet {/*** dirty msg*/private static final long serialVersionUID = 1L;@Overrideprotected void service(HttpServletRequest req, HttpServletResponse arg1)throws ServletException, IOException {String name1 = req.getParameter("name1");String name2 = req.getParameter("name2");String name3 = req.getParameter("name3");System.out.println(name1 + name2 + name3);} }
  • jsp頁面

  • 正確過濾后:

2. listener監(jiān)聽器

2.1 作用

  • 用來監(jiān)聽request/session/application的創(chuàng)建/銷毀/數(shù)據(jù)操作
  • 講一個(gè)ServletContextListener, 用來監(jiān)聽application的創(chuàng)建和銷毀(監(jiān)聽tomcat的開啟和關(guān)閉)

2.2 ServletContextListener demo

  • 配置
<listener><listener-class>test.MyServletContextListener</listener-class></listener>
  • 實(shí)現(xiàn)
package test;import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("服務(wù)器開啟啦。。。 可以初始配置文件啦...");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("服務(wù)器銷毀啦。。。");}}
  • ServletContextAttributeListener,元素的移除,可得到移除信息,rbr
  • request,session的套路類似

總結(jié)

以上是生活随笔為你收集整理的过滤器filter,监听器listener的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。