六、Web服务器——FilterListener 学习笔记
生活随笔
收集整理的這篇文章主要介紹了
六、Web服务器——FilterListener 学习笔记
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今日內(nèi)容
1. Filter:過(guò)濾器 2. Listener:監(jiān)聽(tīng)器Filter:過(guò)濾器
1. 概念:* 生活中的過(guò)濾器:凈水器,空氣凈化器,土匪、* web中的過(guò)濾器:當(dāng)訪問(wèn)服務(wù)器的資源時(shí),過(guò)濾器可以將請(qǐng)求攔截下來(lái),完成一些特殊的功能。* 過(guò)濾器的作用:* 一般用于完成通用的操作。如:登錄驗(yàn)證、統(tǒng)一編碼處理、敏感字符過(guò)濾...2. 快速入門(mén):1. 步驟:1. 定義一個(gè)類,實(shí)現(xiàn)接口Filter2. 復(fù)寫(xiě)方法3. 配置攔截路徑1. web.xml2. 注解2. 代碼:@WebFilter("/*")//訪問(wèn)所有資源之前,都會(huì)執(zhí)行該過(guò)濾器public class FilterDemo1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo1被執(zhí)行了....");//放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}}3. 過(guò)濾器細(xì)節(jié):1. web.xml配置 <filter><filter-name>demo1</filter-name><filter-class>cn.itcast.web.filter.FilterDemo1</filter-class></filter><filter-mapping><filter-name>demo1</filter-name><!-- 攔截路徑 --><url-pattern>/*</url-pattern></filter-mapping>2. 過(guò)濾器執(zhí)行流程1. 執(zhí)行過(guò)濾器2. 執(zhí)行放行后的資源3. 回來(lái)執(zhí)行過(guò)濾器放行代碼下邊的代碼3. 過(guò)濾器生命周期方法1. init:在服務(wù)器啟動(dòng)后,會(huì)創(chuàng)建Filter對(duì)象,然后調(diào)用init方法。只執(zhí)行一次。用于加載資源2. doFilter:每一次請(qǐng)求被攔截資源時(shí),會(huì)執(zhí)行。執(zhí)行多次3. destroy:在服務(wù)器關(guān)閉后,Filter對(duì)象被銷毀。如果服務(wù)器是正常關(guān)閉,則會(huì)執(zhí)行destroy方法。只執(zhí)行一次。用于釋放資源4. 過(guò)濾器配置詳解* 攔截路徑配置:1. 具體資源路徑: /index.jsp 只有訪問(wèn)index.jsp資源時(shí),過(guò)濾器才會(huì)被執(zhí)行2. 攔截目錄: /user/* 訪問(wèn)/user下的所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行3. 后綴名攔截: *.jsp 訪問(wèn)所有后綴名為jsp資源時(shí),過(guò)濾器都會(huì)被執(zhí)行4. 攔截所有資源:/* 訪問(wèn)所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行* 攔截方式配置:資源被訪問(wèn)的方式* 注解配置:* 設(shè)置dispatcherTypes屬性1. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源2. FORWARD:轉(zhuǎn)發(fā)訪問(wèn)資源3. INCLUDE:包含訪問(wèn)資源4. ERROR:錯(cuò)誤跳轉(zhuǎn)資源5. ASYNC:異步訪問(wèn)資源* web.xml配置* 設(shè)置<dispatcher></dispatcher>標(biāo)簽即可5. 過(guò)濾器鏈(配置多個(gè)過(guò)濾器)* 執(zhí)行順序:如果有兩個(gè)過(guò)濾器:過(guò)濾器1和過(guò)濾器21. 過(guò)濾器12. 過(guò)濾器23. 資源執(zhí)行4. 過(guò)濾器25. 過(guò)濾器1 * 過(guò)濾器先后順序問(wèn)題:1. 注解配置:按照類名的字符串比較規(guī)則比較,值小的先執(zhí)行* 如: AFilter 和 BFilter,AFilter就先執(zhí)行了。2. web.xml配置: <filter-mapping>誰(shuí)定義在上邊,誰(shuí)先執(zhí)行 4. 案例:1. 案例1_登錄驗(yàn)證* 需求:1. 訪問(wèn)day17_case案例的資源。驗(yàn)證其是否登錄2. 如果登錄了,則直接放行。3. 如果沒(méi)有登錄,則跳轉(zhuǎn)到登錄頁(yè)面,提示"您尚未登錄,請(qǐng)先登錄"。 2. 案例2_敏感詞匯過(guò)濾* 需求:1. 對(duì)day17_case案例錄入的數(shù)據(jù)進(jìn)行敏感詞匯過(guò)濾2. 敏感詞匯參考《敏感詞匯.txt》3. 如果是敏感詞匯,替換為 *** * 分析:1. 對(duì)request對(duì)象進(jìn)行增強(qiáng)。增強(qiáng)獲取參數(shù)相關(guān)方法2. 放行。傳遞代理對(duì)象 * 增強(qiáng)對(duì)象的功能:* 設(shè)計(jì)模式:一些通用的解決固定問(wèn)題的方式1. 裝飾模式2. 代理模式* 概念:1. 真實(shí)對(duì)象:被代理的對(duì)象2. 代理對(duì)象:3. 代理模式:代理對(duì)象代理真實(shí)對(duì)象,達(dá)到增強(qiáng)真實(shí)對(duì)象功能的目的* 實(shí)現(xiàn)方式:1. 靜態(tài)代理:有一個(gè)類文件描述代理模式2. 動(dòng)態(tài)代理:在內(nèi)存中形成代理類* 實(shí)現(xiàn)步驟:1. 代理對(duì)象和真實(shí)對(duì)象實(shí)現(xiàn)相同的接口2. 代理對(duì)象 = Proxy.newProxyInstance();3. 使用代理對(duì)象調(diào)用方法。4. 增強(qiáng)方法* 增強(qiáng)方式:1. 增強(qiáng)參數(shù)列表2. 增強(qiáng)返回值類型3. 增強(qiáng)方法體執(zhí)行邏輯 package cn.zep.web.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class ProxyTest {public static void main(String[] args) {// 1. 創(chuàng)建真實(shí)對(duì)象Lenovo lenovo = new Lenovo();// 2. 動(dòng)態(tài)代理增強(qiáng)lenovo對(duì)象/*三個(gè)參數(shù):1.類加載器:真實(shí)對(duì)象.getClass().getClassLoader()2.接口數(shù)組:真實(shí)對(duì)象.getClass().getInterfaces()3.處理器:new InvocationHandler()*/SaleComputer proxy_lenovo = (SaleComputer)Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {/*** 代理邏輯編寫(xiě)的方法,代理對(duì)象調(diào)用的所有方法都會(huì)觸發(fā)該方法執(zhí)行* @param proxy 代理對(duì)象* @param method 代理對(duì)象調(diào)用的方法被封裝為的對(duì)象* @param args 代理對(duì)象調(diào)用方法時(shí),傳遞的實(shí)際參數(shù)* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/* System.out.println("該方法執(zhí)行了。。。。");System.out.println(method.getName());System.out.println(args[0]);*/// 判斷是否是sale方法if (method.getName().equals("sale")) {// 1.增強(qiáng)參數(shù)double money = (double) args[0];money = money * 0.85;// 3.增強(qiáng)方法體System.out.println("專車接");// 使用真實(shí)對(duì)象調(diào)用該方法String obj = (String) method.invoke(lenovo, money);System.out.println("免費(fèi)送貨");// 2.增強(qiáng)返回值return obj + "_鼠標(biāo)墊";}else {// 使用真實(shí)對(duì)象調(diào)用該方法dObject obj = method.invoke(lenovo, args);return obj;}}});// 2. 調(diào)用方法String computer = proxy_lenovo.sale(8000);System.out.println(computer); // proxy_lenovo.show();} }
Listener:監(jiān)聽(tīng)器
* 概念:web的三大組件之一。* 事件監(jiān)聽(tīng)機(jī)制* 事件 :一件事情* 事件源 :事件發(fā)生的地方* 監(jiān)聽(tīng)器 :一個(gè)對(duì)象* 注冊(cè)監(jiān)聽(tīng):將事件、事件源、監(jiān)聽(tīng)器綁定在一起。 當(dāng)事件源上發(fā)生某個(gè)事件后,執(zhí)行監(jiān)聽(tīng)器代碼* ServletContextListener:監(jiān)聽(tīng)ServletContext對(duì)象的創(chuàng)建和銷毀* 方法:* void contextDestroyed(ServletContextEvent sce) :ServletContext對(duì)象被銷毀之前會(huì)調(diào)用該方法* void contextInitialized(ServletContextEvent sce) :ServletContext對(duì)象創(chuàng)建后會(huì)調(diào)用該方法* 步驟:1. 定義一個(gè)類,實(shí)現(xiàn)ServletContextListener接口2. 復(fù)寫(xiě)方法3. 配置1. web.xml<listener><listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class></listener>* 指定初始化參數(shù)<context-param>2. 注解:* @WebListener
web.xml版:
ContextLoaderListener.java:
package cn.zep.web.listener;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;public class ContextLoaderListener implements ServletContextListener {/**** 監(jiān)聽(tīng)ServletContext對(duì)象創(chuàng)建的,ServletContext對(duì)象在服務(wù)器啟動(dòng)后自動(dòng)創(chuàng)建* 在服務(wù)器啟動(dòng)后自動(dòng)調(diào)用* @param servletContextEvent*/@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("ServletContext對(duì)象被創(chuàng)建了。。。");}/**** 在服務(wù)器關(guān)閉后,ServletContext對(duì)象被銷毀。當(dāng)服務(wù)器正常關(guān)閉后,該方法被執(zhí)行調(diào)用* @param servletContextEvent*/@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("ServletContext對(duì)象被銷毀了。。。");} }
注解版:
ContextLoaderListener.java:
web.xml:
<?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>demo2</filter-name><filter-class>cn.zep.web.filter.FilterDemo2</filter-class></filter><filter-mapping><filter-name>demo2</filter-name><url-pattern>/*</url-pattern></filter-mapping>--><!--配置監(jiān)聽(tīng)器--> <!-- <listener><listener-class>cn.zep.web.listener.ContextLoaderListener</listener-class></listener>--><!--指定初始化參數(shù)--><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/classes/applicationContext.xml</param-value></context-param></web-app>總結(jié)
以上是生活随笔為你收集整理的六、Web服务器——FilterListener 学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 十、简单线性回归的python实现(详解
- 下一篇: 手写实现深拷贝函数