監(jiān)聽(tīng)器和過(guò)濾器
監(jiān)聽(tīng)器
* 作用:
* 監(jiān)聽(tīng)request民傻、session嵌溢、application三個(gè)域?qū)ο蟮膭?chuàng)建蛀蜜,銷毀和數(shù)據(jù)的變更
* 使用:
* 1特碳、創(chuàng)建一個(gè)普通java類實(shí)現(xiàn)指定的接口
1.監(jiān)聽(tīng)request的創(chuàng)建和銷毀:ServletRequestListener
* requestInitialized(ServletRequestEvent sre)
* requestDestroyed(ServletRequestEvent sre)
? 形參:
? ServletRequestEvent可以獲取當(dāng)前監(jiān)聽(tīng)到的request對(duì)象诚亚,對(duì)request對(duì)象的中的資源進(jìn)行操作晕换。
2.? ? 監(jiān)聽(tīng)request作用域數(shù)據(jù)的變更:ServletRequestAttributeListener
* attributeAdded(ServletRequestAttributeEvent srae)
* attributeRemoved(ServletRequestAttributeEvent srae)
* attributeReplaced(ServletRequestAttributeEvent srae)
* 形參:
* ServletRequestAttributeEvent可以獲取當(dāng)前被監(jiān)聽(tīng)到的request中的數(shù)據(jù)。
* geName()返回監(jiān)聽(tīng)到的數(shù)據(jù)的鍵和getValue()返回監(jiān)聽(tīng)的到的數(shù)據(jù)的值站宗。
注意:獲取的值總是第一個(gè)設(shè)置的值闸准。
3.? ? 監(jiān)聽(tīng)session的創(chuàng)建和銷毀:HttpSessionListener
* sessionCreated(HttpSessionEvent se)
* sessionDestroyed(HttpSessionEvent se)
* 形參:
* 獲取當(dāng)前被監(jiān)聽(tīng)到的session對(duì)象
4 、 監(jiān)聽(tīng)session的作用域數(shù)據(jù)的變更:
* attributeAdded(HttpSessionBindingEvent event)
* attributeRemoved(HttpSessionBindingEvent event)
* attributeReplaced(HttpSessionBindingEvent event)
* 形參:
* 獲取當(dāng)前監(jiān)聽(tīng)到的session中的數(shù)據(jù) getName()返回?cái)?shù)據(jù)的鍵名梢灭,getValue()返回?cái)?shù)據(jù)的值
5.? ?監(jiān)聽(tīng)application對(duì)象的創(chuàng)建和銷毀:ServletContextListener
* contextInitialized(ServletContextEvent sce)
* contextDestroyed(ServletContextEvent sce)
* 形參:
* 獲取application對(duì)象
6.? ?監(jiān)聽(tīng)application對(duì)象的數(shù)據(jù)的變更:ServletContextAttributeListener
* attributeAdded(ServletContextAttributeEvent event)
* attributeRemoved(ServletContextAttributeEvent event)
* attributeReplaced(ServletContextAttributeEvent event)
* 形參:獲取當(dāng)前被監(jiān)聽(tīng)的數(shù)據(jù) getName()返回?cái)?shù)據(jù)的鍵名夷家,getValue()返回?cái)?shù)據(jù)的值
7、在項(xiàng)目中的web.xml中配置監(jiān)聽(tīng)器敏释,讓監(jiān)聽(tīng)器生效
* <listener>
? <listener-class>監(jiān)聽(tīng)器類的包名和類名</listener-class>
? </listener>
? 示例:
? <listener>
? <listener-class>com.bjsxt.listener.MyListener</listener-class>
? </listener>
案例:統(tǒng)計(jì)在線人數(shù)
過(guò)濾器
1.為什么需要過(guò)濾器库快?
* 目前我們?cè)L問(wèn)Servlet,是可以直接進(jìn)行訪問(wèn)的钥顽,沒(méi)有進(jìn)行任何防護(hù)缺谴。可是會(huì)造成服務(wù)器資源的浪費(fèi)耳鸯,以及安全性不高湿蛔。我們希望真的在請(qǐng)求被Servlet處理之前,進(jìn)行一次請(qǐng)求的校驗(yàn)县爬,符合要求再調(diào)用對(duì)應(yīng)的Servlet進(jìn)行請(qǐng)求處理
2.過(guò)濾器使用:
2.1阳啥、創(chuàng)建一個(gè)普通java類并實(shí)現(xiàn)過(guò)濾器接口Filter
2.2、在web.xml中配置過(guò)濾器
* <filter>
<filter-name>配置的過(guò)濾器名稱</filter-name>
<filter-class>要配置的過(guò)濾器的全限定路徑:包名.類名</filter-class>
</filter>
<filter-mapping>
<filter-name>配置的過(guò)濾器名稱</filter-name>
<url-pattern>過(guò)濾器攔截請(qǐng)求地址的范圍</url-pattern>
</filter-mapping>
示例:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.bjsxt.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.Filter接口的方法
過(guò)濾器之doFilter方法
作用: 服務(wù)器在接收到瀏覽器發(fā)過(guò)來(lái)的請(qǐng)求后财喳,先解析請(qǐng)求信息察迟,創(chuàng)建對(duì)象request和response
然后根據(jù)請(qǐng)求URL地址判斷如果符合過(guò)濾器的過(guò)濾范圍,則會(huì)調(diào)用過(guò)濾器中的doFilter來(lái)
進(jìn)行請(qǐng)求攔截耳高,并將request和response對(duì)象作為實(shí)參傳遞給doFilter方法扎瓶。我們
可以在doFilter方法中聲明過(guò)濾器攔截代碼。
參數(shù):
ServletRequest:接收此次攔截的請(qǐng)求的request實(shí)參
ServletResponse:接收此次攔截的請(qǐng)求的response實(shí)參
FilterChain:可以進(jìn)行請(qǐng)求放行
chain.doFilter(request, response);
技能點(diǎn)二:過(guò)濾器之init和destory方法
init方法:服務(wù)器啟動(dòng)時(shí)調(diào)用
destory方法:服務(wù)器關(guān)閉時(shí)調(diào)用
證明:過(guò)濾器的生命周期為從服務(wù)器開(kāi)啟到服務(wù)器關(guān)閉
4.:過(guò)濾器之?dāng)r截范圍配置
攔截所有:/*
攔截部分Servlet的請(qǐng)求:*.do
攔截指定Servlet的請(qǐng)求:和要攔截的指定的Servlet的url-pattern配置完全一致即可泌枪,例如:/my
注意:過(guò)濾器之間會(huì)出現(xiàn)多重?cái)r截概荷,如果是按照攔截?cái)r截范圍的大小在web.xml中自大而小進(jìn)行的配置
則會(huì)先執(zhí)行大范圍的攔截器,再執(zhí)行小范圍的攔截器碌燕。
過(guò)濾器案例:參照整合項(xiàng)目中的過(guò)濾器寫法
使用過(guò)濾器統(tǒng)一編碼格式
使用過(guò)濾器進(jìn)行session管理
使用過(guò)濾器進(jìn)行權(quán)限管理
5误证、過(guò)濾器案例之統(tǒng)一請(qǐng)求編碼格式
在doFilter中使用
?//設(shè)置請(qǐng)求編碼格式
request.setCharacterEncoding("utf-8");
//設(shè)置響應(yīng)編碼格式
?response.setContentType("text/html;charset=utf-8");???????????????
注意:一旦使用了過(guò)濾器,就需要在過(guò)濾其中使用編碼格式設(shè)置修壕,如果不設(shè)置愈捅,則需要在每個(gè)servlet中是設(shè)置編碼格式設(shè)置。
6.