JAVA過濾器的使用(Filter)


request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

這是在Servlet里面設置字符編碼的代碼,但是通常情況下Servlet不止一個,所以我們需要在每一個Servlet中都寫上上面的代碼,這樣的話,不僅麻煩,而且容易搞混淆。

所以我們對於這類多個Servlet中會執行相同的代碼的時候,我們通常可以使用過濾器來幫我們完成操作:


過濾器:

如果想要使用過濾器,首先需要實現Filter類,並重寫三個需要的方法:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "TestFilter2",urlPatterns = "/*")
public class TestFilter2 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

init方法:    容器在創建當前過濾器的時候自動調用;

destroy方法:  容器在銷毀當前過濾器的時候自動調用

doFilter方法:  過濾器的主要代碼寫在這個地方

 1 @WebFilter(filterName = "TestFilter2",urlPatterns = "/*") 

這一行代碼的意思是添加一個注解,通過這行代碼就不需要再去web.xml中注冊了

其中 filterName 代表的是這個過濾器的名字,后面那個urlPatterns 代表的是過濾的路徑 /* 代表所有路徑,意味着訪問所有的路徑的時候都會先訪問這個過濾器

chain.doFilter(req, resp);

這一行代碼代表的是如果還有其他的過濾器就調用其它的過濾器,但是需要注意,這一行代碼必須寫在doFilter方法的最后面

 

 1 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
 2         //這樣在每個Servlet執行的時候都會先進行這個
 3         HttpServletRequest request = (HttpServletRequest) req;
 4         HttpServletResponse response = (HttpServletResponse) resp;
 5 
 6         request.setCharacterEncoding("utf-8");
 7         response.setContentType("text/html;charset=utf-8");
 8 
 9         //因為有可能不止這一個過濾器,所以需要將所有的過濾器執行
10         //注意 這一行代碼一定要寫到最后
11         chain.doFilter(req, resp);
12     }

其中3-7行代碼就是設置編碼

由於doFilter傳遞進來的默認是ServletRequest對象 而設置字符集的是在HttpServetRequest 所以我們需要強制轉換一下

轉換過后我們就可以進行設置了。

 

下面附上我另外一個測試過濾器的代碼:

 1 import javax.servlet.*;
 2 import javax.servlet.annotation.WebFilter;
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletRequestWrapper;
 5 import javax.servlet.http.HttpServletResponse;
 6 import java.io.IOException;
 7 import java.io.UnsupportedEncodingException;
 8 
 9 /**
10  * urlPatterns代表的是需要將那些路徑進行過濾器過濾  這里為* 代表所有的路徑都需要進入這個過濾器
11  */
12 @WebFilter(filterName = "TestFilter",urlPatterns = "/*")
13 public class TestFilter implements Filter {
14     public void destroy() {
15     }
16 
17     /**
18      * 在這里面寫的任何代碼  在執行Servlet JSP 等前 都會被執行
19      */
20     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
21         //這樣在每個Servlet執行的時候都會先進行這個
22         HttpServletRequest request = (HttpServletRequest) req;
23         HttpServletResponse response = (HttpServletResponse) resp;
24 
25         request.setCharacterEncoding("utf-8");
26         response.setContentType("text/html;charset=utf-8");
27 
28         //因為有可能不止這一個過濾器,所以需要將所有的過濾器執行
29         //注意 這一行代碼一定要寫到最后
30         chain.doFilter(req, resp);
31     }
32 
33     public void init(FilterConfig config) throws ServletException {
34 
35     }
36 
37     //通過重寫getParameter方法,實現get方法自動轉碼
38     class MyWrapper extends HttpServletRequestWrapper{
39         private HttpServletRequest request;
40         public MyWrapper(HttpServletRequest request) {
41             super(request);
42             this.request = request;
43         }
44 
45         @Override
46         public String getParameter(String name) {
47             String value = this.request.getParameter(name);
48             if(value == null){
49                 return null;
50             }
51 
52             //如果是get方法提交過來的
53             if(this.request.getMethod().equalsIgnoreCase("get")){
54                 try {
55                     // 進行轉碼
56                     value = new String(value.getBytes("ISO-8859-1"),"utf-8");
57                 } catch (UnsupportedEncodingException e) {
58                     e.printStackTrace();
59                 }
60             }
61 
62             //屏蔽尖括號 換成 > <
63             value = value.replace(">",">");
64             value = value.replace("<","&lt;");
65 
66             return value;
67         }
68     }
69 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM