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