request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
這是在Servlet裏面設置字符編碼的代碼,可是一般狀況下Servlet不止一個,因此咱們須要在每個Servlet中都寫上上面的代碼,這樣的話,不只麻煩,並且容易搞混淆。html
因此咱們對於這類多個Servlet中會執行相同的代碼的時候,咱們一般可使用過濾器來幫咱們完成操做:java
過濾器:web
若是想要使用過濾器,首先須要實現Filter類,並重寫三個須要的方法:app
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方法: 容器在建立當前過濾器的時候自動調用;ide
destroy方法: 容器在銷燬當前過濾器的時候自動調用測試
doFilter方法: 過濾器的主要代碼寫在這個地方this
1 @WebFilter(filterName = "TestFilter2",urlPatterns = "/*") 編碼
這一行代碼的意思是添加一個註解,經過這行代碼就不須要再去web.xml中註冊了url
其中 filterName 表明的是這個過濾器的名字,後面那個urlPatterns 表明的是過濾的路徑 /* 表明全部路徑,意味着訪問全部的路徑的時候都會先訪問這個過濾器spa
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("<","<"); 65 66 return value; 67 } 68 } 69 }