-
@JAVA過(guò)濾機(jī)制——過(guò)濾簡(jiǎn)介 1、過(guò)濾器三部分:過(guò)濾源(用戶(hù)請(qǐng)求)——>過(guò)濾規(guī)則——>過(guò)濾結(jié)果 2、過(guò)濾器不處理結(jié)果,只做輔助性操作 3、定義:過(guò)濾器是一個(gè)【服務(wù)器端】的組件,它可以【截取用戶(hù)端的請(qǐng)求和響應(yīng)信息】,并對(duì)這些信息過(guò)濾 4.案列:登錄案例、編碼轉(zhuǎn)換案例
查看全部 -
四種不同過(guò)濾器,通過(guò)四種不同標(biāo)簽,在xml中做標(biāo)記就可以實(shí)現(xiàn)不同的監(jiān)聽(tīng)
查看全部 -
用Filter處理編碼問(wèn)題:
????在過(guò)濾器中添加:
????????request.setCharacterEncoding("utf-8");
????或者:在web.xml中配置初始化參數(shù)
????????
查看全部 -
登錄案例中的放行:
查看全部 -
Servlet3.0支持注解形式的Filter
查看全部 -
過(guò)濾器的實(shí)現(xiàn):
????① 實(shí)現(xiàn)Filter接口
????② 在web.xml中配置過(guò)濾器
查看全部 -
過(guò)濾器常見(jiàn)的使用場(chǎng)景
查看全部 -
web.xml配置
查看全部 -
過(guò)濾器可以改變用戶(hù)請(qǐng)求的web資源,可以改變用戶(hù)請(qǐng)求的路徑(跳轉(zhuǎn));
過(guò)濾器不能直接返回?cái)?shù)據(jù),不能直接處理用戶(hù)請(qǐng)求;
查看全部 -
過(guò)濾器工作原理:
過(guò)濾器生命周期:
過(guò)濾器鏈:
過(guò)濾器的分類(lèi):
查看全部 -
在web.xml中配置
<filter>
??? <filter-name>LoginFilter</filter-name>
??? <filter-class>com.filter.LoginFilter</filter-class>
??? <!-- 指定部分頁(yè)面,在代碼中實(shí)現(xiàn)對(duì)這些頁(yè)面放行 -->
??? <init-param>
????? <param-name>noLoginPaths</param-name>
????? <param-value>index.jsp;login.jsp;LoginServlet;fail.jsp</param-value>
??? </init-param>
??? <init-param>
????? <param-name>charset</param-name>
????? <param-value>UTF-8</param-value>
??? </init-param>
</filter>在Filter中
private FilterConfig config = null;public void init(FilterConfig arg0) throws ServletException {
?config = arg0; // 將實(shí)例化時(shí)的init-param存入config
}public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
???throws IOException, ServletException {
?String charset = config.getInitParameter("charset"); // 從config中獲得字符集
??? if(charset==null){
????? charset = "UTF-8";
??? }
??? request.setCharacterEncoding(charset); // 設(shè)定字符集為UTF-8
}編碼轉(zhuǎn)換 ? ? 字符集轉(zhuǎn)換防止亂碼
使用: request.setCharacterEncoding("config.getInitParameter("XX")")
?XX參數(shù)內(nèi)容“UTF-8”
查看全部 -
@WebFilter注解的常用屬性:
查看全部 -
Servelt2.5:過(guò)濾器的分類(lèi):
查看全部 -
過(guò)濾器分類(lèi)(通過(guò)<dispatcher>標(biāo)簽)
通過(guò)<dispatcher>標(biāo)簽的值不同把過(guò)濾器分類(lèi).此標(biāo)簽中有四個(gè)值可以選擇,可以同時(shí)選擇多個(gè).
包括request、forword、include、error
假設(shè)同一個(gè)過(guò)濾器關(guān)聯(lián)了index.jsp與main.jsp.此過(guò)濾器的<dispatcher>標(biāo)簽值為request.
在過(guò)濾器中的doFilter()方法中
public void doFilter(ServletRequest req,ServletResponse rep,FilterChain chain){
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)rep;
response.sendRedirect(request.getContextPath()+"/main.jsp");
}
當(dāng)用戶(hù)訪(fǎng)問(wèn)index.jsp頁(yè)面時(shí),便會(huì)被過(guò)濾器截取.并執(zhí)行doFilter()方法中的重定向去main.jsp頁(yè)面.但main.jsp也關(guān)聯(lián)了此過(guò)濾器,過(guò)濾器會(huì)截取到重定向新Web資源的請(qǐng)求.因此又會(huì)調(diào)用doFilter()方法中的重定向去main.jsp.所以是死循環(huán)的狀態(tài).
因?yàn)橹囟ㄏ蚴菍儆趓equest的行為.因此會(huì)被<dispatcher>標(biāo)簽值為request的過(guò)濾器截取到.即<dispatcher>標(biāo)簽值為request的過(guò)濾器可以截取重定向新Web資源的請(qǐng)求.
當(dāng)過(guò)濾器的doFilter()方法中用 request.getRequestDispatcher("/main.jsp").forward(arg0, arg1)請(qǐng)求轉(zhuǎn)發(fā)到main.jsp.此時(shí)當(dāng)用戶(hù)請(qǐng)求訪(fǎng)問(wèn)index.jsp時(shí),便會(huì)被過(guò)濾器截取,并且執(zhí)行doFilter()方法,然后請(qǐng)求轉(zhuǎn)發(fā)到main.jsp頁(yè)面.此時(shí)用戶(hù)可以訪(fǎng)問(wèn)到main.jsp頁(yè)面,并沒(méi)有被過(guò)濾器截取.因?yàn)檎?qǐng)求轉(zhuǎn)發(fā)屬于forward行為.因此<dispatcher>標(biāo)簽值為request的過(guò)濾器是截取不了通過(guò)請(qǐng)求轉(zhuǎn)發(fā)去新Web資源的請(qǐng)求.盡管<url-pattern>設(shè)置了main.jsp關(guān)聯(lián)過(guò)濾器,但仍然截取不了.請(qǐng)求轉(zhuǎn)發(fā):瀏覽器的地址欄不會(huì)變化,性能相對(duì)更好一些,因?yàn)楂@取的資源是沒(méi)有二次講過(guò)瀏覽器的<br><br>
重定向:瀏覽器的地址欄是會(huì)變化的,獲取資源的時(shí)候經(jīng)過(guò)了二次通過(guò)瀏覽器發(fā)送請(qǐng)求的過(guò)程。1.請(qǐng)求轉(zhuǎn)發(fā)
請(qǐng)求轉(zhuǎn)發(fā)是指將請(qǐng)求再轉(zhuǎn)發(fā)到另一資源(一般為JSP或Servlet)。此過(guò)程依然在同一個(gè)請(qǐng)求范圍內(nèi),轉(zhuǎn)發(fā)后瀏覽器地址欄內(nèi)容不變
請(qǐng)求轉(zhuǎn)發(fā)使用RequestDispatcher接口中的forward()方法來(lái)實(shí)現(xiàn),該方法可以把請(qǐng)求轉(zhuǎn)發(fā)到另外一個(gè)資源,并讓該資源對(duì)瀏覽器的請(qǐng)求進(jìn)行響應(yīng)
RequestDispatcher rd = request.getRequestDispatcher(path); rd.forward(request,response);
或request.getRequestDispatcher(path) .forward(request,response);
2.重定向
重定向是指頁(yè)面重新定位到某個(gè)新地址,之前的請(qǐng)求失效,進(jìn)入一個(gè)新的請(qǐng)求,且跳轉(zhuǎn)后瀏覽器地址欄內(nèi)容將變?yōu)樾碌闹付ǖ刂?br />重定向是通過(guò)HttpServletResponse對(duì)象的sendRedirect()來(lái)實(shí)現(xiàn),該方法相當(dāng)于瀏覽器重新發(fā)送一個(gè)請(qǐng)求
response.sendRedirect(path);
forward轉(zhuǎn)發(fā) :一次請(qǐng)求一次回應(yīng) 服務(wù)器跳轉(zhuǎn)
sendredirect重定向: 兩次請(qǐng)求兩次回應(yīng) 客戶(hù)端跳轉(zhuǎn)
由于sendredirect是request,會(huì)激活REQUEST類(lèi)型的過(guò)濾器,因此要注意,是否會(huì)形成重定向循環(huán)
request 過(guò)濾request請(qǐng)求
forward 過(guò)濾重定向請(qǐng)求
include 過(guò)濾include請(qǐng)求查看全部 -
過(guò)濾器鏈的執(zhí)行過(guò)程:
用戶(hù)請(qǐng)求-->過(guò)濾器1-->過(guò)濾器2-->servlet service-->過(guò)濾器2-->過(guò)濾器1-->用戶(hù)
查看全部
舉報(bào)