1. 程式人生 > 其它 >javaweb中過濾器Filter的解析與使用之解決中文亂碼

javaweb中過濾器Filter的解析與使用之解決中文亂碼

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都要進行編碼的轉換了