一、Filter
作用:
1、登錄驗(yàn)證——不登錄不讓請(qǐng)求其他資源
2罪郊、關(guān)鍵字過(guò)濾
.....
使用方法:
- 1橄维、創(chuàng)建一個(gè)Filter接口的實(shí)現(xiàn)類凛忿,重寫(xiě)接口中的抽象方法
public class FilterDemo1 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
public void destroy() {
}
}
Filter接口中的方法說(shuō)明:
①.init方法:服務(wù)器啟動(dòng)時(shí)床牧,會(huì)創(chuàng)建Filter對(duì)象壕吹,調(diào)用唯一的一次init方法咒劲。
②.doFilter方法:每次有過(guò)濾路徑的資源的請(qǐng)求,就調(diào)用一次。
chain.doFilter(req, resp);作用是放行嫉父。③.destroy方法:服務(wù)器正常關(guān)閉前擂红,調(diào)用一次,一般用于釋放資源成榜。
2挣输、用web.xml或者使用注解進(jìn)行配置
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.注解配置:
@WebFilter(value = "攔截路徑" , dispatcherTypes={攔截方式,..} )
攔截路徑的寫(xiě)法:
- 具體資源路徑: /index.jsp 只有訪問(wèn)index.jsp資源時(shí),過(guò)濾器才會(huì)被執(zhí)行
- 攔截目錄: /user/* 訪問(wèn)/user下的所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
- 后綴名攔截: *.jsp 訪問(wèn)所有后綴名為jsp資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
- 攔截所有資源:/* 訪問(wèn)所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行
攔截方式的寫(xiě)法:
設(shè)置dispatcherTypes屬性
DispatcherType. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源
DispatcherType. FORWARD:轉(zhuǎn)發(fā)訪問(wèn)資源
DispatcherType. INCLUDE:包含訪問(wèn)資源
DispatcherType. ERROR:錯(cuò)誤跳轉(zhuǎn)資源
DispatcherType. ASYNC:異步訪問(wèn)資源
過(guò)濾器鏈:就好比幾層的篩子舅踪。
過(guò)濾器的執(zhí)行流程:
1. 過(guò)濾器1
2. 過(guò)濾器2
3. 資源執(zhí)行
4. 過(guò)濾器2
5. 過(guò)濾器1
過(guò)濾器先后順序問(wèn)題:
- 注解配置:按照類名的字符串比較規(guī)則比較皮胡,值小的先執(zhí)行
- 如: AFilter 和 BFilter烹笔,AFilter就先執(zhí)行了亿鲜。
- web.xml配置: <filter-mapping>誰(shuí)定義在上邊垒探,誰(shuí)先執(zhí)行
二夷蚊、動(dòng)態(tài)代理實(shí)現(xiàn)request對(duì)象增強(qiáng)
代理模式是一種設(shè)計(jì)模式
所謂代理就是第三方箱歧,去調(diào)用原來(lái)的方法并且在此之上進(jìn)行一些功能的增強(qiáng)微谓,何為動(dòng)態(tài)代理姻氨,就是使用反射技術(shù)進(jìn)行實(shí)現(xiàn),不用依賴于具體的類文件乘粒。
關(guān)于代理的概念:
- 真實(shí)對(duì)象:被代理的對(duì)象
- 代理對(duì)象:真實(shí)對(duì)象增強(qiáng)之后的對(duì)象。
- 代理模式:代理對(duì)象代理真實(shí)對(duì)象系谐,達(dá)到增強(qiáng)真實(shí)對(duì)象功能的目的。
動(dòng)態(tài)代理的實(shí)現(xiàn)步驟:
- 代理對(duì)象和真實(shí)對(duì)象實(shí)現(xiàn)相同的接口
- 代理對(duì)象 = Proxy.newProxyInstance();
- 使用代理對(duì)象調(diào)用方法向叉。
- 增強(qiáng)方法
newProxyInstance()方法的參數(shù)列表:
真實(shí)對(duì)象.getClass().getClassLoader()——類加載器,把真實(shí)對(duì)象的Class對(duì)象加載進(jìn)入內(nèi)存演顾。
真實(shí)對(duì)象.getClass().getInterfaces()——獲取所有的接口的Class對(duì)象
new InvocationHandler(){
代理對(duì)象調(diào)用所有的方法都會(huì)執(zhí)行此方法,調(diào)用的方法對(duì)象會(huì)傳給method參數(shù)佑钾。
代理對(duì)象調(diào)用方法的參數(shù)會(huì)傳遞給args數(shù)組對(duì)象孽尽。
匿名內(nèi)部類實(shí)現(xiàn) invoke(Object proxy, Method method, Object[] args) 方法
}
敏感字過(guò)濾器
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
//攔截資源路徑為testSensitiveFilterServlet
@WebFilter("/testSensitiveFilterServlet")
public class SensitivewordsFilter implements Filter {
List<String> sensitiveWordsList = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
try{
String realPath = config.getServletContext().getRealPath("/WEB-INF/classes/words.txt");
System.out.println(realPath);
BufferedReader br = new BufferedReader(new FileReader(realPath));
String line = null;
while((line = br.readLine())!=null){
sensitiveWordsList.add(line);
}
System.out.println(sensitiveWordsList);
}catch (Exception e){
e.printStackTrace();
}
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//使用動(dòng)態(tài)代理來(lái)增強(qiáng)getParameter方法,完成過(guò)濾工作
ServletRequest proxy_Requset = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
//調(diào)用getParameter方法method就是getParameter方法對(duì)象
//args是getParameter(String str)的str數(shù)據(jù)。
//調(diào)用setAttribute方法method就是setAttribute方法對(duì)象
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("getParameter".equals(method.getName())){
String msg = (String) method.invoke(req,args);
for (String s : sensitiveWordsList) {
if (msg.contains(s)){
msg = msg.replaceAll(s,"***");
}
}
return msg;
}
return method.invoke(req,args);
}
});
chain.doFilter(proxy_Requset, resp);
}
public void destroy() {
}
}
三、監(jiān)聽(tīng)器Listener
Web三大技術(shù):Servlet、Filter磅轻、Listener
事件監(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:web容器監(jiān)聽(tīng)器
監(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)用該方法
- 步驟:
- 定義一個(gè)ServletContextListener的實(shí)現(xiàn)類,重寫(xiě)接口的抽象方法丧枪。
-
- 配置
- web.xml
<listener>
<listener-class>監(jiān)聽(tīng)器類的路徑</listener-class>
</listener>
<!-- 指定初始化參數(shù),一般用來(lái)加載默認(rèn)配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
//使用servletContext.getInitParameter("contextConfigLocation");就能獲取到param-value里的值光涂。