1.什么是過濾器
過濾器實際上就是對web資源進行攔截,做些處理后再交給下一個過濾器或者servlet的一個程序
2.經典應用場景
(1)處理中文亂碼
(2)實現權限攔截(登陸驗證)
(3)過濾非法字符等
3.Filter開發步驟
(1)新建一個空的maven工程
(2)在pom.xml文件中導入相關依賴
1 <dependencies> 2 <dependency> 3 <groupId>javax.servlet</groupId> 4 <artifactId>servlet-api</artifactId> 5 <version>2.5</version> 6 </dependency> 7 <dependency> 8 <groupId>javax.servlet.jsp</groupId> 9 <artifactId>javax.servlet.jsp-api</artifactId> 10 <version>2.3.3</version> 11 </dependency> 12 <dependency> 13 <groupId>javax.servlet.jsp.jstl</groupId> 14 <artifactId>jstl-api</artifactId> 15 <version>1.2</version> 16 </dependency> 17 <dependency> 18 <groupId>taglibs</groupId> 19 <artifactId>standard</artifactId> 20 <version>1.1.2</version> 21 </dependency> 22 <dependency> 23 <groupId>mysql</groupId> 24 <artifactId>mysql-connector-java</artifactId> 25 <version>5.1.45</version> 26 </dependency> 27 </dependencies>
(3)在src/java目錄下新建立一個com.xiaoma.filter.CharacterFilter的類文件,在類文件中實現Filter類並重寫init、doFilter、destroy方法,參考代碼如下:
其中chain參數總結:
①:過濾器中的所有代碼,在過濾特定請求的時候都會執行
②:必須要讓過濾器繼續通行,說白了就是把這個請求往下轉交,就需要用到下面的第19行大媽
1 package com.xiaoma.filter;
2
3 import javax.servlet.*;
4 import java.io.IOException;
5
6 public class CharacterFilter implements Filter {
//web服務器啟動的時候就開始初始化了,因為他要隨時監聽資源
7 @Override
8 public void init(FilterConfig filterConfig) throws ServletException {
9 System.out.println("CharacterFilter初始化中......");
10 }
11
12 @Override
13 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
14 servletRequest.setCharacterEncoding("utf-8");
15 servletResponse.setCharacterEncoding("utf-8");
16 servletResponse.setContentType("text/html");
17
18 System.out.println("CharacterFilter執行前......");
19 filterChain.doFilter(servletRequest,servletResponse);
20 System.out.println("CharacterFilter執行后......");
21 }
22
23 @Override
24 public void destroy() {
25 System.out.println("CharacterFilter銷毀中......");
26 }
27 }
(4)在src/java目錄下新建立一個com.xiaoma.servlet.ShowServlet的類文件,隨便輸出點東西用於測試
1 package com.xiaoma.servlet;
2
3 import javax.servlet.ServletException;
4 import javax.servlet.http.HttpServlet;
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.http.HttpServletResponse;
7 import java.io.IOException;
8
9 public class ShowServle extends HttpServlet {
10 @Override
11 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
12 13 resp.getWriter().write("你好,世界");
14 }
15
16 @Override
17 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
18 super.doPost(req, resp);
19 }
20 }
(5)配置web.xml文件,包括servlet和filter的配置
1 <servlet> 2 <servlet-name>showServlet</servlet-name> 3 <servlet-class>com.xiaoma.servlet.ShowServle</servlet-class> 4 </servlet> 5 <!--使用了過濾器的mapping--> 6 <servlet-mapping> 7 <servlet-name>showServlet</servlet-name> 8 <url-pattern>/servlet/show</url-pattern> 9 </servlet-mapping> 10 <!--沒有使用過濾器的mapping--> 11 <servlet-mapping> 12 <servlet-name>showServlet</servlet-name> 13 <url-pattern>/show</url-pattern> 14 </servlet-mapping> 15 16 <filter> 17 <filter-name>CharacterFilter</filter-name> 18 <filter-class>com.xiaoma.filter.CharacterFilter</filter-class> 19 </filter> 20 <filter-mapping> 21 <filter-name>CharacterFilter</filter-name> 22 <!--我們過濾servlet路徑下的所有請求--> 23 <url-pattern>/servlet/*</url-pattern> 24 </filter-mapping>
(6)運行測試,訪問http://localhost:8080/javaweb_filter_war_exploded/show的時候,也就是沒用過濾器的時候依舊亂碼,訪問http://localhost:8080/javaweb_filter_war_exploded/servlet/show的時候也就是用了亂碼過濾器后就不會亂碼了,這樣我們就不用每寫一個servlet或者jsp都要進行編碼的轉換了



