-
1、HttpRequest和ServletRequest區別
2、FilterInit(FilterConfig)初始化的用法
3、requset.getRequestURI()???????? //獲取請求頁面的相對路徑
4、String的方法str.indexOf("XXX")??? //獲取str內容"XXX"在那個位置第一位為0
5、String的方法str.split(";")??? //才分str為多個string,以";"為才分線request.getContextPath();
save user info to session
在doFilter中獲得ServletRequest convert to HttpServletRequest之后,request.getSession,接著在獲得的session中設置
過濾的黑名單和白名單需要在FitlerConfig中配置
對于白名單放行
if true chain.doFilter
黑名單跳轉到相應的處理頁面
else response.sendRedirect
FilterConfig配置
filter url:/*(*號是全匹配)
request.getRequestURI();(獲得當前request請求的URI地址,用于判斷是否合法請求)
使用參數配置->init()->config.getInitParameter(name)(獲得FilterConfig)查看全部 -
1.概念:過濾器是一個服務器上的組件,它可以截取用戶端的請求和相應信息,并對這些信息過濾<br>
2.工作原理:<br>
用戶請求——》xml文件中如果過濾器可以匹配則截取,否則不走過濾器——》過濾器放行方法之前的代碼——》web資源——》web的響應返回到過濾器,然后過濾器執行方興方法之后的代碼——》過濾器把web的響應返回給用戶<br>
<br>
<br>
3.過濾器的生命周期:
實例化:web容器加載過濾器的配置信息<br>
初始化:filterServlet中的init()方法獲得配置信息,放到filterConfig對象里面<br>
private FilterConfig cf;<br>
public void init(FilterConfig arg0) throws ServletException {<br>
cf = arg0;<br>
}<br>
過濾 :進行過濾操作<br>
銷毀:執行完畢銷毀<br>
<br>
<br>
4.過濾器的API:
5.多個過濾器(過濾器鏈)<br>
<br>
6.過濾器分類<br>
<br>
7.過濾器實例:登錄過濾器和編碼過濾器查看全部 -
我來說說我對異步過濾器的理解吧。根據過濾器的規則,過濾器得等servlet執行結束才能停止,所以如果servlet執行很久,過濾器得等很久,所以說呢,為了使得過濾器早點執行結束,就讓servlet在后臺執行,過濾器提前結束,這就是異步過濾器的優點所在
@WebServlet(asyncSupported = true, displayName = "/AsyncServlet", urlPatterns={"/servlet/AsyncServlet"})
asyncSupported = true 是必須開啟用以支持異步
@WebFilter(filterName="AsynFilter",asyncSupported=true,value={"/servlet/AsyncServlet"},dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC})
asyncSupported = true 是必須開啟用以支持異步
dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC}
DispatcherType.REQUEST必須要加上,否則過濾器就不會生效了
同時注意在過濾的地址和servlet的地址必須相同查看全部 -
request ? ?用戶直接訪問頁面時(eg:請求response.sendredirect請求重定向),Web容器將會調用過濾器
? ? forward ? 目標資源通過RequestDispatcher的forward訪問時,該過濾器被調用 ?<jsp:forward也能觸發
? ? include ? ?目標資源通過RequestDispatcher的include訪問時,該過濾器被調用 ? <jsp:include也能觸發 ? ?
? ? error ? ? ? ?目標資源通過聲明式處理機制調用時,該過濾器被調用<error-page>
??? <error-code>404</error-code>//500
??? <location>/error.jsp</location>
??? </error-page>
<filter>
??????? <filter-name>ErrorFilter</filter-name>
??????? <filter-class>com.imooc.filter.ErrorFilter</filter-class>
??? </filter>
??? <filter-mapping>
??????? <filter-name>ErrorFilter</filter-name>
??????? <url-pattern>/error.jsp</url-pattern>
??????? <dispatcher>ERROR</dispatcher>
??? </filter-mapping>
@error.jsp
您輸入的路徑有誤!
@ErrorFilter.java
public void doFilter(ServletRequest servletrequest,
ServletResponse servletresponse, FilterChain filterchain)
throws IOException, ServletException {
System.out.println("檢測到有錯誤的信息!");
filterchain.doFilter(servletrequest, servletresponse);//注意:放行
}
Servlet3.0中加入了@引言的這種方式.
@WebFilter用來將一個類聲明為過濾器,該注解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署為過濾器.(部署理解為項目發布,就會把Web.xml文件與項目的文件讀取在Web容器里,部署的時候容器就會識別注解,將相應的類部署為過濾器.啟動服務器才執行過濾器的初始化方法.)
則添加過濾器不需要再web.xml中配置.直接在過濾器類里加入@WebFilter聲明即可.
filter-mapping元素用來聲明Web應用中的過濾器映射。過濾器可被映射到一個servlet或一個URL模式。將過濾器映射到一個servlet中會造成過濾器作用于servlet上。將過濾器映射到一個URL模式中則可以將過濾器應用于任何資源,只要該資源的URL與URL模式匹配。過濾是按照部署描述符的filter-mapping元素出現的順序執行的。
過濾器filter-mapping的<servlet-name>標簽意思是過濾器關聯Servlet,當某些用戶請求訪問Servlet的時候,會被過濾器截取請求.(即Web容器會調用過濾器的doFilter()方法)
過濾器filter-mapping的<url-pattern>標簽意思是過濾器關聯的URL地址.當用戶訪問關聯的URLWeb資源時,會被過濾器截取請求.(即Web容器會調用過濾器的doFilter()方法)
圖中上部分是Servlet3.0配置過濾器的方法.下部分是Servlet2.5的配置過濾器方法.查看全部 -
過濾器分類(通過<dispatcher>標簽)
通過<dispatcher>標簽的值不同把過濾器分類.此標簽中有四個值可以選擇,可以同時選擇多個.
包括request、forword、include、error
假設同一個過濾器關聯了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");
}
當用戶訪問index.jsp頁面時,便會被過濾器截取.并執行doFilter()方法中的重定向去main.jsp頁面.但main.jsp也關聯了此過濾器,過濾器會截取到重定向新Web資源的請求.因此又會調用doFilter()方法中的重定向去main.jsp.所以是死循環的狀態.
因為重定向是屬于request的行為.因此會被<dispatcher>標簽值為request的過濾器截取到.即<dispatcher>標簽值為request的過濾器可以截取重定向新Web資源的請求.
當過濾器的doFilter()方法中用 request.getRequestDispatcher("/main.jsp").forward(arg0, arg1)請求轉發到main.jsp.此時當用戶請求訪問index.jsp時,便會被過濾器截取,并且執行doFilter()方法,然后請求轉發到main.jsp頁面.此時用戶可以訪問到main.jsp頁面,并沒有被過濾器截取.因為請求轉發屬于forward行為.因此<dispatcher>標簽值為request的過濾器是截取不了通過請求轉發去新Web資源的請求.盡管<url-pattern>設置了main.jsp關聯過濾器,但仍然截取不了.請求轉發:瀏覽器的地址欄不會變化,性能相對更好一些,因為獲取的資源是沒有二次講過瀏覽器的<br><br>
重定向:瀏覽器的地址欄是會變化的,獲取資源的時候經過了二次通過瀏覽器發送請求的過程。
以下內容源自其他同學,當然,自己百度搜索一下也是一樣的
這個也是一個參考:http://jingyan.baidu.com/article/37bce2be71adad1002f3a2c7.html
1.請求轉發
請求轉發是指將請求再轉發到另一資源(一般為JSP或Servlet)。此過程依然在同一個請求范圍內,轉發后瀏覽器地址欄內容不變
請求轉發使用RequestDispatcher接口中的forward()方法來實現,該方法可以把請求轉發到另外一個資源,并讓該資源對瀏覽器的請求進行響應
RequestDispatcher rd = request.getRequestDispatcher(path); rd.forward(request,response);
或request.getRequestDispatcher(path) .forward(request,response);
2.重定向
重定向是指頁面重新定位到某個新地址,之前的請求失效,進入一個新的請求,且跳轉后瀏覽器地址欄內容將變為新的指定地址
重定向是通過HttpServletResponse對象的sendRedirect()來實現,該方法相當于瀏覽器重新發送一個請求
response.sendRedirect(path);
forward轉發 :一次請求一次回應 服務器跳轉
sendredirect重定向: 兩次請求兩次回應 客戶端跳轉
由于sendredirect是request,會激活REQUEST類型的過濾器,因此要注意,是否會形成重定向循環
request 過濾request請求
forward 過濾重定向請求
include 過濾include請求查看全部 -
Filter可認為是Servlet的一種“變種”,它主要用于對用戶請求進行預處理,也可以對HttpServletResponse進行后處理,是個典型的處理鏈。它與Servlet的區別在于:它不能直接向用戶生成響應。完整的流程是:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。
Filter有如下幾個用處。
在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。
根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數據。
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。
根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。
Filter可負責攔截多個請求或響應;一個請求或響應也可被多個請求攔截。
創建一個Filter只需兩個步驟:
創建Filter處理類(實現Filter接口).
web.xml文件中配置Filter(配置<filter>與<filter-mapping>).<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
? <display-name>JavaWeb_001_fistFilter</display-name>
? <welcome-file-list>
??? <welcome-file>index.jsp</welcome-file>
? </welcome-file-list>
?
? <filter>
? <filter-name>FistFilter</filter-name>
? <filter-class>com.filter.FistFilter</filter-class>
? </filter>
? <filter-mapping>
? <filter-name>FistFilter</filter-name>
? <url-pattern>/index.jsp</url-pattern>
? </filter-mapping>
?
? <filter>
? <filter-name>SecondFilter</filter-name>
? <filter-class>com.filter.SecondFilter</filter-class>
? </filter>
? <filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
? </filter-mapping>
?
</web-app>查看全部 -
1.什么是過濾器?<br>
過濾器是web服務器端的一個組件,可以截獲用戶的請求和web資源的響應,對請求和響應進行過濾
2.過濾器的工作原理?<br>
原理:用戶發送請求到過濾器,過濾器將用戶請求發送到web資源,web資源將響應發送到過濾器,過濾器將響應發送給用戶
3.過濾器的工作周期
a.在web容器啟動的時候實例化,調用初始化方法,每次有請求響應過來調用doFilter()方法,服務器容器關閉的時候調用銷毀方法。查看全部 -
過濾器大多數時間消耗在doFilter()方法中,doFilter()方法被Web容器調用,即被服務器調用,因為Web容器存在Tomcat容器中,Tomcat就是服務器.
doFilter()方法同時傳入ServletRequest Request、ServletResponse Response和Filter Chain對象的引用.然后過濾器就有機會處理請求,將處理任務傳遞給鏈中的下一個資源,(通過調用Filter Chain對象引用上的doFilter方法),之后在處理控制權返回該過濾器時處理響應.
關于chain.doFilter(request,response)
他的作用是將請求轉發給過濾器鏈上的下一個對象.這里的下一下對象指的是下一個filter,如果沒有filter那就是你請求的資源.一般filter都是一個鏈,在一個項目的web.xml中有幾個<filter>.就有幾個過濾器.
request->filter1->filter2->filter3->....->request resource(請求的Web資源),然后得到Web資源的響應,再沿著鏈返回給request.查看全部 -
過濾器xml配置
查看全部 -
分類
查看全部 -
web.xml配置
查看全部 -
三個方法
查看全部 -
過濾器的生命周期
查看全部 -
12
查看全部 -
11
查看全部
舉報