Java web—Servlet过滤器(Filter)
前言:
????????過濾器是Servlet中一個非常重要的組成部分,進行WEB開發時無不用到過濾器;因此這篇blog來單獨總結下關于過濾器的知識點。
一、首先來了解一下什么是過濾器:
下面這句話引自這篇文章
Filte即過濾器,它是Servlet技術中最激動人心的技術,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。
Servlet API中提供了一個Filter接口,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截,如下:
二、Filter特點:
- Servlet過濾器可以檢查和修改ServletRequest和ServletResponse對象。
- Servlet過濾器可以被指定和特定的URL關聯,且不能獨立執行,只有當客戶請求訪問該URL時,才會觸發過濾器。
- Servlet過濾器可以被串聯在一起,形成管道效應,協同修改請求和響應對象(過濾器鏈)。
三、過濾器的實現:
建立一個過濾器涉及下列五個步驟:
1、建立一個實現Filter接口的類:
- Servlet過濾器類必須實現javax.servlet.Filter
- 這個接口含有3個過濾器類必須實現的方法:
- public void init(FilterConfig config) thows ServletException只在此過濾器第一次初始化時執行
- 簡單過濾器可提供此方法的空體,兩種情況使用init:
2、在doFilter方法中實現過濾行為:
- 重要方法:
3、調用FilterChain對象的doFilter方法:
- 最后一個參數FilterChain對象。對此對象調用以激活與servlet或JSP相關的下一個過濾器。如果沒有另一個相關的過濾器,則對doFilter的調用激活servlet或JSP本身
4、對相應的servlet和JSP頁面注冊過濾器:
- web.xml中用于過濾器的元素:
filter:元素向系統注冊一個過濾對象
filter-mapping:元素指定該過濾對象所應用的URL
<filter-name>必需元素,必須與用filter元素聲明時給予過濾器的名稱相匹配
<url-pattern>必需元素,此元素聲明一個以斜杠"/"開始的模式,它指定過濾器應用的URL。
例:
要求:利用filter和filter-mapping指示名為SomeFilter的過濾器應用到名為SomeServlet的servlet。
web.xml應配置為:
<filter><filter-name>SomeFilter</filter-name><filter-class>sPackage.SFilterClass</filter-class> </filter> <filter-mapping> <filter-name>SomeFilter</filter-name><servlet-name>SomeServlet</servlet-name> </filter-mapping>5、禁用激活器servlet:
- 在對資源應用過濾器時,可通過指定要應用過濾器的URL模式或servlet名來完成。
- 如果提供servlet名,則此名稱必須與web.xml的servlet元素中給出的名稱相匹配。
- 如果使用應用到一個serlvet的URL模式,則此模式必須與利用web.xml的元素servlet-mapping指定的模式相匹配。
- 防止用戶利用缺省servlet URL繞過過濾器設置 。
四、對請求信息的過濾:
對請求信息的過濾大致分為下列5個步驟:
因為Servlet對中文支持不好,用戶提交的表單信息會產生亂碼問題,會給后臺的數據查詢和記錄(數據庫存儲)等功能造成影響,因此需要對請求信息進行轉碼。
解決方法一:
直接在Servlet中轉碼
處理get請求::
String name = request.getParameter(param_name);name = new String( name.getBytes("ISO8859_1") );處理post請求:
request.setCharacterEncoding("utf-8");直接在servlet里處理的缺點是從request中取出的每個中文變量都要轉換,且不能動態的改變編碼。
解決方法二:
在過濾器中進行轉碼,且在一個動態web項目里設置完成后就可以不用在單個Servlet中一一設置了。
例:
Filter類:
過濾器部署描述:
<filter><filter-name>encod</filter-name><filter-class>pdsu.edu.cn.chu.MyFilter</filter-class><init-param><param-name>encoding</param-name><param-value>gb2312</param-value></init-param></filter> <filter-mapping><filter-name>encod</filter-name><url-pattern>/*</url-pattern> <filter-mapping>過濾器只能解決Post提交的中文亂碼問題,Get提交中文亂碼解決方法為:
修改tomcat配置文件下的server.xml,找到對8080端口進行服務的Connector組件的設置部分,為Connector添加屬性URIEncoding="GBK"
五、對響應信息的過濾:
🆗,關于Filter的總結暫時就這么多。 = ̄ω ̄=
總結
以上是生活随笔為你收集整理的Java web—Servlet过滤器(Filter)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java web—Cookie与Sess
- 下一篇: Java SE 重点知识笔记