Ⅰ Servlet過濾器是什麼
在 J2EE 探索者 系列文章的最後一篇中,作者 Kyle Gabhart 將向您介紹 Servlet過濾器體系結構,定義過濾器的許多應用,並指導您完成典型過濾器實現的三個步驟。他還會透露 bean 的一些激動人心的變化,預計剛發布的 Java Servlet 2.4 規范會引入這些變化。Servlet過濾器是可插入的 Web 組件,它允許我們實現 Web 應用程序中的預處理和後期處理邏輯。過濾器支持 servlet 和 JSP 頁面的基本請求處理功能,比如日誌記錄、性能、安全、會話處理、XSLT 轉換,等等。 過濾器最初是隨 Java Servlet 2.3 規范發布的,最近定稿的 2.4 規范對它進行了重大升級。在這 J2EE 探索者 系列文章的最後一篇中,我將向您介紹 Servlet過濾器的基礎知識 —— 比如總體的體系結構設計、實現細節,以及在 J2EE Web 應用程序中的典型應用,還會涉及一些預計最新的 Servlet 規范將會提供的擴展功能。? Servlet過濾器是小型的 Web 組件,它們攔截請求和響應,以便查看、提取或以某種方式操作正在客戶機和伺服器之間交換的數據。過濾器是通常封裝了一些功能的 Web 組件,這些功能雖然很重要,但是對於處理客戶機請求或發送響應來說不是決定性的。典型的例子包括記錄關於請求和響應的數據、處理安全協議、管理會話屬性,等等。過濾器提供一種面向對象的模塊化機制,用以將公共任務封裝到可插入的組件中,這些組件通過一個配置文件來聲明,並動態地處理。Servlet過濾器中結合了許多元素,從而使得過濾器成為獨特、強大和模塊化的 Web 組件。也就是說,Servlet過濾器是:聲明式的:過濾器通過 Web 部署描述符(web.xml)中的 XML 標簽來聲明。這樣允許添加和刪除過濾器,而無需改動任何應用程序代碼或 JSP 頁面。動態的:過濾器在運行時由 Servlet 容器調用來攔截和處理請求和響應。靈活的:過濾器在 Web 處理環境中的應用很廣泛,涵蓋諸如日誌記錄和安全等許多最公共的輔助任務。過濾器還是靈活的,因為它們可用於對來自客戶機的直接調用執行預處理和後期處理,以及處理在防火牆之後的 Web 組件之間調度的請求。最後,可以將過濾器鏈接起來以提供必需的功能。模塊化的:通過把應用程序處理邏輯封裝到單個類文件中,過濾器從而定義了可容易地從請求/響應鏈中添加或刪除的模塊化單元。可移植的:與 Java 平台的其他許多方面一樣,Servlet過濾器是跨平台和跨容器可移植的,從而進一步支持了 Servler 過濾器的模塊化和可重用本質。可重用的:歸功於過濾器實現類的模塊化設計,以及聲明式的過濾器配置方式,過濾器可以容易地跨越不同的項目和應用程序使用。透明的:在請求/響應鏈中包括過濾器,這種設計是為了補充(而不是以任何方式替代)servlet 或 JSP 頁面提供的核心處理。因而,過濾器可以根據需要添加或刪除,而不會破壞 servlet 或 JSP 頁面。所以Servlet過濾器是通過一個配置文件來靈活聲明的模塊化可重用組件。過濾器動態地處理傳入的請求和傳出的響應,並且無需修改應用程序代碼就可以透明地添加或刪除它們。最後,過濾器獨立於任何平台或者 Servlet 容器,從而允許將它們容易地部署到任何相容的 J2EE 環境中。在接下來的幾小節中,我們將進一步考察 Servlet過濾器機制的總體設計,以及實現、配置和部署過濾器所涉及的步驟。我們還將探討 Servlet過濾器的一些實際應用,最後簡要考察一下模型-視圖-控制器(MVC)體系結構中包含的 Servlet過濾器,從而結束本文的討論。Servlet過濾器體系結構 正如其名稱所暗示的,Servlet過濾器 用於攔截傳入的請求和/或傳出的響應,並監視、修改或以某種方式處理正在通過的數據流。過濾器是自包含、模塊化的組件,可以將它們添加到請求/響應鏈中,或者在無需影響應用程序中其他 Web 組件的情況下刪除它們。過濾器僅只是改動請求和響應的運行時處理,因而不應該將它們直接嵌入 Web 應用程序框架,除非是通過 Servlet API 中良好定義的標准介面來實現。Web 資源可以配置為沒有過濾器與之關聯(這是默認情況)、與單個過濾器關聯(這是典型情況),甚至是與一個過濾器鏈相關聯。那麼過濾器究竟做什麼呢? 像 servlet 一樣,它接受請求並響應對象。然後過濾器會檢查請求對象,並決定將該請求轉發給鏈中的下一個組件,或者中止該請求並直接向客戶機發回一個響應。如果請求被轉發了,它將被傳遞給鏈中的下一個資源(另一個過濾器、servlet 或 JSP 頁面)。在這個請求設法通過過濾器鏈並被伺服器處理之後,一個響應將以相反的順序通過該鏈發送回去。這樣就給每個過濾器都提供了根據需要處理響應對象的機會。當過濾器在 Servlet 2.3 規范中首次引入時,它們只能過濾 Web 客戶機和客戶機所訪問的指定 Web 資源之間的內容。如果該資源然後將請求調度給其他 Web 資源,那就不能向幕後委託的任何請求應用過濾器。2.4 規范消除了這個限制。Servlet過濾器現在可以應用於 J2EE Web 環境中存在請求和響應對象的任何地方。因此,Servlet過濾器可以應用在客戶機和 servlet 之間、servlet 和 servlet 或 JSP 頁面之間,以及所包括的每個 JSP 頁面之間。這才是我所稱的強大能力和靈活性!實現一個 Servlet過濾器 他們說「好事多磨」。我不知道「他們」指的是誰,或者這句古老的諺語究竟有多真實,但是實現一個 Servlet過濾器的確要經歷三個步驟。
Ⅱ servlet怎麼使用多個過濾器
只需要一個過濾器,過濾所有URL,在filter類中做如下操作:代碼參考,相信你會懂的。
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
HttpServletRequestreq=(HttpServletRequest)request;
Stringuri=((HttpServletRequest)request).getRequestURI();
List<String>urilist=newArrayList<String>();
urilist.add("/UserLoginReg/DoRegisterServlet");
urilist.add("/UserLoginReg/UserManageServlet");
urilist.add("/UserLoginReg/FindUserServlet");
if(urilist.contains(uri)==true){
HttpSessionsession=req.getSession(true);
//從session里取的用戶名信息
UserBeanuser=(UserBean)session.getAttribute("userall");
//判斷如果沒有取到用戶信息,就跳轉到登陸頁面
if(user==null){
//跳轉到登陸頁面
request.setAttribute("info","請先登錄");
req.getRequestDispatcher("WEB-INF/jsp/login.jsp").forward(request,
response);
}else{
//已經登陸,繼續此次請求
chain.doFilter(request,response);
}
}else{
//已經登陸,繼續此次請求
chain.doFilter(request,response);
}
}
Ⅲ 我寫的servlet過濾器有問題大家看看這是怎麼了謝謝
你的url-pattern應該是*或者*.jsp了吧,反正過濾器包含了index.jsp,每次訪問都經過這個過濾器,然後
if(session.getAttribute("user")==null){一直成立,所以瀏覽器一直在訪問這個index.jsp,每次都被重定向到index.jsp,就出現了你說的那種情況。
你現在有兩種方式解決這個問題
1、url-pattern改改,反正就是不讓包含index.jsp
2、改filter的代碼,
if(session.getAttribute("user")==null){
這個判斷加一個條件if(session.getAttribute("user")==null && !"/index.jsp".equals(從request獲取的URI)){,//反正就這意思,具體訪問那個index.jsp的URI放那就行了,你可以先列印出來看看是什麼
你可以把你web.xml的filter配置粘貼出來看看
Ⅳ Java Servlet程序的過濾器,如下選項,哪些數據不在過濾器攔截范圍內 A. reques
這幾個選項都可以在過濾器的攔截范圍內,
過濾器要攔截什麼完全取決你自己如何實現Filter介面的如下方法
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
在該方法中你可以根據request獲取上面4個數據進行攔截。
推薦你看下」輕量級java ee企 業應用實戰「這本書,你會知道Filter怎麼實現,怎麼用。
然後你就會發現你這個題目有多麼荒誕了。
Ⅳ 編寫servlet 過濾器時,下面哪個介面用於調用過濾器
javax.servlet.Filter
實現來這個介面,這個介面有三源個方法。
void init(FilterConfig var1) 過濾器初始化時調用的方法
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) 過濾器執行時調用的方法。
void destroy() 過濾器被銷毀時調用的方法。
Ⅵ 怎麼搞一個servlet登錄過濾器
把JSP頁面全部放在WEB-INF下面 ,編寫一個BaseServlet繼承自HttpServlet,然後其餘的servlet集成自BaseServlet,在這個servlet裡面判斷session,有值的時候轉發到servlet裡面 沒有值的話 跳轉到登陸頁面 不就可以了?或者在filter裡面寫上
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
String uri = req.getRequestURI();
System.out.println( uri );
// 如果請求的路徑是首頁的資源,那麼不需要過濾
if ( !"/loginServlet".equals(uri) && !"/".equals(uri) && !uri.startsWith("/img/") && !uri.startsWith("images") ) {
// 過濾請求,保證訪問的資源一定要在用戶登錄後才可訪問
HttpSession session = req.getSession();
if ( session.isNew() ) {
// 跳轉到首頁
resp.sendRedirect("/");
} else {
User user = (User)session.getAttribute(Const.SESS_PARAM_USER);
if ( user == null ) {
// 跳轉到首頁
resp.sendRedirect("/");
} else {
chain.doFilter(request, response);
}
}
} else {
chain.doFilter(request, response);
}
Ⅶ 編寫servlet過濾器時下面哪個介面用於調用過濾器連接
Filter簡介
Filter稱濾器Servlet技術實用技術Web發員通Filter技術web伺服器管理所web資源:例Jsp,
Servlet, 靜態圖片文件或靜態 html
文件等進行攔截實現些特殊功能例實現URL級別許可權訪問控制、濾敏詞彙、壓縮響應信息等些高級功能
主要用於用戶請求進行預處理HttpServletResponse進行處理使用Filter完整流程:Filter用戶請求進行預處理接著請求交給Servlet進行處理並響應Filter再伺服器響應進行處理
Filter功能
HttpServletRequest達 Servlet 前攔截客戶HttpServletRequest 根據需要檢查HttpServletRequest修改HttpServletRequest 數據
HttpServletResponse達客戶端前攔截HttpServletResponse 根據需要檢查HttpServletResponse修改HttpServletResponse數據
何藉助Filter實現攔截功能
Filter介面doFilter發員編寫Filter並配置哪web資源進行攔截Web伺服器每調用web資源service前都先調用filterdoFilter該內編寫代碼達目:
調用目標資源前讓段代碼執行
否調用目標資源(即否讓用戶訪問web資源)
web伺服器調用doFilter傳遞filterChain象進filterChain象filter介面重要象提供doFilter發員根據需求決定否調用調用該則web伺服器調用web資源service即web資源訪問否則web資源訪問
Filter發兩步走
編寫java類實現Filter介面並實現其doFilter
web.xml文件編寫filter類進行注冊並設置所能攔截資源
web.xml配置各節點介紹:
指定濾器
用於濾器指定名字該元素內容能空
元素用於指定濾器完整限定類名
元素用於濾器指定初始化參數元素指定參數名字指定參數值
濾器使用FilterConfig介面象訪問初始化參數
元素用於設置 Filter 所負責攔截資源Filter攔截資源通兩種式指定:Servlet 名稱資源訪問請求路徑
元素用於設置filter注冊名稱該值必須元素聲明濾器名字
設置 filter 所攔截請求路徑(濾器關聯URL式)
指定濾器所攔截Servlet名稱
指定濾器所攔截資源 Servlet 容器調用式REQUEST,INCLUDE,FORWARDERROR默認REQUEST用戶設置元素用指定 Filter 資源種調用式進行攔截
元素設置值及其意義
REQUEST:用戶直接訪問頁面Web容器調用濾器目標資源通RequestDispatcherinclude()或forward()訪問該濾器調用
INCLUDE:目標資源通RequestDispatcherinclude()訪問該濾器調用除外該濾器調用
FORWARD:目標資源通RequestDispatcherforward()訪問該濾器調用除外該濾器調用
ERROR:目標資源通聲明式異處理機制調用該濾器調用除外濾器調用
Filter鏈
web應用發編寫Filter些Filter組合起稱Filter鏈
web伺服器根據Filterweb.xml文件注冊順序決定先調用哪Filter第FilterdoFilter調用web伺服器創建代表Filter鏈FilterChain象傳遞給該doFilter發員調用FilterChain象doFilter則web伺服器檢查FilterChain象否filter則調用第2filter沒則調用目標資源
Filter命周期
public void init(FilterConfig filterConfig) throws ServletException;//初始化
我編寫Servlet程序Filter創建銷毀由WEB伺服器負責 web 應用程序啟web 伺服器創建Filter 實例象並調用其init讀取web.xml配置完象初始化功能續用戶請求作攔截准備工作(filter象創建init執行)發員通init參數獲代表前filter配置信息FilterConfig象
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//攔截請求
完實際濾操作客戶請求訪問與濾器關聯URL候Servlet濾器先執行doFilterFilterChain參數用於訪問續濾器
public void destroy();//銷毀
Filter象創建駐留內存web應用移除或伺服器停止才銷毀Web容器卸載 Filter 象前調用該Filter命周期僅執行釋放濾器使用資源
FilterConfig介面
用戶配置filter使用filter配置些初始化參數web容器實例化Filter象調用其init封裝filter初始化參數filterConfig象傳遞進發員編寫filter通filterConfig象獲內容:
String getFilterName();//filter名稱
String getInitParameter(String name);//返部署描述指定名稱初始化參數值存返null.
Enumeration getInitParameterNames();//返濾器所初始化參數名字枚舉集合
public ServletContext getServletContext();//返Servlet文象引用
Filter使用案例
使用Filter驗證用戶登錄安全控制
前段間參與維護項目用戶退系統再址欄訪問歷史根據url仍能夠進入系統響應頁面我檢查發現請求未進行濾驗證用戶登錄添加filter搞定問題
先web.xml配置
SessionFilter
com.action.login.SessionFilter
logonStrings
/project/index.jsp;login.do
includeStrings
.do;.jsp
redirectPath
/index.jsp
disabletestfilter
N
SessionFilter
/*
接著編寫FilterServlet
package com.action.login;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* 判斷用戶否登錄,未登錄則退系統
*/
public class SessionFilter implements Filter {
public FilterConfig config;
public void destroy() {
this.config = null;
}
public static boolean isContains(String container, String[] regx) {
boolean result = false;
for (int i = 0; i < regx.length; i++) {
if (container.indexOf(regx[i]) != -1) {
return true;
}
}
return result;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hrequest = (HttpServletRequest)request;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
String logonStrings = config.getInitParameter("logonStrings"); // 登錄登陸頁面
String includeStrings = config.getInitParameter("includeStrings"); // 濾資源綴參數
String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// 沒登陸轉向頁面
String disabletestfilter = config.getInitParameter("disabletestfilter");// 濾器否效
if (disabletestfilter.toUpperCase().equals("Y")) { // 濾效
chain.doFilter(request, response);
return;
}
String[] logonList = logonStrings.split(";");
String[] includeList = includeStrings.split(";");
if (!this.isContains(hrequest.getRequestURI(), includeList)) {// 指定濾參數綴進行濾
chain.doFilter(request, response);
return;
}
if (this.isContains(hrequest.getRequestURI(), logonList)) {// 登錄頁面進行濾
chain.doFilter(request, response);
return;
}
String user = ( String ) hrequest.getSession().getAttribute("useronly");//判斷用戶否登錄
if (user == null) {
wrapper.sendRedirect(redirectPath);
return;
}else {
chain.doFilter(request, response);
return;
}
}
public void init(FilterConfig filterConfig) throws ServletException {
config = filterConfig;
}
}
既完用戶所請求均要經Filter進行驗證用戶登錄
防止文亂碼濾器
項目使用spring框架前台JSP頁面Java代碼使用同字元集進行編碼候現表單提交數據或者傳/載文名稱文件現亂碼問題使用濾器
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
false
encoding
/*
-
Ⅷ 關於Servlet過濾器的問題
相同,1,如果沒有過濾器的話,會跳轉到過濾器處理後的request請求的頁面,專如果你用的是request跳轉頁面,就屬相同,如果用response那麼就是重定向,他們的request和response就不相同,
2.chain.doFilter(request,response)之後的代碼是在你過濾器放行之後,把你當前的請求執行完過後才執行的,比如說:用戶發送一個請求到你的伺服器,被你的過濾器攔截下來了,並且過濾通過以後,那麼它會完成當前請求所需要的操作。當請求完成的時候,伺服器要響應給客戶端的時候,它就會執行你chain.doFilter(request,response)之後的代碼
Ⅸ 過濾器 servlet里漢字顯示
這個過濾器過濾的是服務端接受客戶端的時候,不會出現亂碼,而客戶端顯示的時候,是由服務端發送給客戶端的,用的是response,你需要做的是,在服務端發送給客戶端前,需要設置一下編碼:response.setCharacterEncoding("utf-8"),當然假如你的頁面編碼是utf-8的話,好了,試試吧,問題應該解決了吧!
另外,如果用到了資料庫的話,那麼資料庫的編碼和頁面的也要一直才行
Ⅹ servlet 過濾器執行完chain.doFilter(req, rep);之後再去執行什麼代碼
在調用制servlet的service()方法之前,容器會先創建一個filterchain,並把servlet傳入這個filterchain對象,作為其內部參數。創建這個filter chain的時候,會根據請求的uri,把符合條件的filter加入到這個chain里。緊接著就調用這個filter chain的doFilter方法。這個filter chain的doFilter方法就會按順序(在web.xml定義的順序)調用各個filter的doFilter方法。當所有的filter的doFilter方法都調用完以後,才會調用servlet的service方法。