1. java過濾器的1、request過濾器
這種過濾器的工作方式比較簡單,大家也經常遇到,如下圖所示:
以下是web.xml文件配置方式:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目標資源一</servlet-name>
</filter-mapping>
下面我們更改一下web.xml文件的配置,如下方式:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目標資源一</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目標資源二</servlet-name>
</filter-mapping>
也就是說此過濾器對目標資源一和目標資源二都進行過濾,然後當目標資源一被訪問的時候我們將請求轉發給目標資源二,那麼這個時候過濾器是怎麼工作的呢?如下圖所示:
我們可以看到,當我們訪問目標資源一時過濾器截取了請求,然後再轉發給目標資源一,然後再轉發給目標資源二,從圖中我們可以看到過濾器沒有截取轉發到目標資源二的請求,但是我們已經在web.xml文件中配置了該過濾器對目標資源二的過濾,為什麼又沒有起到過濾作用呢?
答案就在於,目標資源一是客戶端直接訪問,而目標資源二是被轉發過來的,這時過濾器就不能過濾目標資源二。如果你直接訪問目標資源二,你會發現該過濾器起到了作用?
我們上面的web.xml文件配置與以下方式等價:
<filter>myFilter</filter>
<filter-name>myFilter</filter-name>
<filter-class>xx.MyFilter</filte-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目標資源一</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目標資源二</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
這種方式的配置,說明只有直接訪問該目標資源時該過濾器才會起作用,對轉發到該目標資源的請求將忽略不處理。
那如果我想對轉發到目標資源二的請求進行過濾,那怎麼辦呢?答案見,下一種過濾器,forward過濾器。
2. java web 過濾器跟攔截器的區別和使用
區別如下:
1 、攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2 、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3 、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4 、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5 、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
使用如下:
在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交「修改的注冊信息」的網頁,當用戶填寫完修改信息並提交後,伺服器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。
這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功後,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。
(2)java過濾器不起作用擴展閱讀:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。
3. java過濾器的3、include過濾器
理解了forward過濾器之後,include過濾器就不難理解了。以下方式:
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目標資源二</servlet-name>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
此表示對包含了目標資源二的請求過濾,如果直接訪問目標資源二,則此過濾器將不起作用。
include包含以下語句:
在JSP頁面中的動作:<jsp:include page=.......
在Java代碼中的request.getRequestDispatcher(....).include
注意:如果目標資源一通過<%@ include file=目標資源二%>指令包含,這時此過濾器不工作。
4. java 文件過濾器為什麼報空指針異常求詳解!!!
accept函數你用的不對,它只需要你指定過濾條件就可以了,不需要遞歸調用.
如果你需要其子目錄下的.png文件,可以另外寫一個遞歸調用.
完整的文件過濾的Java程序如下
importjava.io.File;
importjava.io.FilenameFilter;
{
@Override
publicbooleanaccept(Filedir,Stringname){
if(name.toLowerCase().endsWith(".png"))returntrue;
returnfalse;
}
}
publicclassFileDemo6_1{
staticvoidfindFile(Filedir){
if(dir.isDirectory()){
File[]fs1=dir.listFiles(newMyFilenameFilter1());
for(Filefile2:fs1){
System.out.println(file2);
}
File[]fs=dir.listFiles();
for(Filefile:fs){
findFile(file);
}
}
}
publicstaticvoidmain(String[]args){
findFile(newFile("C:/tmp/6"));
}
}
運行結果
C: mp6female.png
C: mp6male.png
C: mp6imagefemale.png
5. java web項目中過濾器的使用(過濾器執行多次)
圖片中顯示的log是執行一次的。
不是本來就打開login.jsp嗎,不用再跳轉到login.jsp,不是的時候,再跳轉。
6. javaee怎樣使filter不生效
過濾器配置正確,但卻沒有起到過濾作用,原因可能是排放位置的問題。如下: 錯誤: struts2 com.yiwo.base.web.filter.PrepareFilter userFilter com.yiwo.base.web.filter.UserFilter
7. 編寫個過濾器不起作用
index.jsp頁面與filter.jsp頁面是不是放在項目的根目錄下了?如果不是的話,過濾器不起作用
8. java web項目裡面的加了過濾器,在自己電腦上面測試項目的時候就打不開網頁了,怎麼回事
這是我自己寫過的一個登陸過濾器
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
System.out.println("=============LoginFilter============");
//將父類轉成子類
HttpServletRequest request=(HttpServletRequest) req;
//javaweb_T7/LoginServlet
String uri=request.getRequestURI();
//控制登錄的
HttpSession session=request.getSession();
String userName=(String) session.getAttribute("userName");
//如果沒有登錄就跳轉
//要麼你session中有東西(已經登錄) ,要麼你是登錄的動作
if(userName!=null || uri.indexOf("LoginServlet")!=-1){
//如果登錄過,就不阻攔
chain.doFilter(req, res);
}else{
request.setAttribute("msg", "請先登錄後操作");
request.getRequestDispatcher("login.jsp")
.forward(request, res);
}
}
9. java過濾器 response不好用,高手給看看!!!
建議把java代碼中的漢字用utf-8編碼後返回
在頁面有utf-8再解碼
10. 為何java中的過濾器filter不起作用
過濾器配置正抄確,但卻沒有起到過濾作用,原因可能是排放位置的問題。如下:
錯誤:
<filter>
<filter-name>struts2</filter-name>
<filter-class>com.yiwo.base.web.filter.PrepareFilter</filter-class>
</filter>
<filter>
<filter-name>userFilter</filter-name>
<filter-class>com.yiwo.base.web.filter.UserFilter</filter-class>
</filter>