javaweb中過濾器Filter的解析與使用之解決中文亂碼
阿新 • • 發佈:2021-10-10
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都要進行編碼的轉換了