Filter過濾器(Servlet)
阿新 • • 發佈:2018-02-25
過濾器 一個 rac ini per response 格式 troy set
Filter,簡單的說就是用來過濾從客戶端發送到服務器端的信息。
創建Filter的過程:
1.創建一個類實現Filter接口:
public class MyFilter implements Filter
2.在配置文件中修改配置信息:
<filter> <filter-name>MyFilter</filter-name> <filter-class>com.filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
過濾器相關的配置和過濾鏈:
配置:
url-partern :指示在哪個位置進行攔截(過濾)
dispacher :包含四個內置屬性:
ERROR:錯誤頁面跳轉
FORWORD:請求轉發
INCLUDE:請求包含(頁面中包含的文件)
REQUEST:請求request
過濾鏈:
FilterChain:將過濾器連接成一條鏈。放行方向為下一個過濾器,這個順序是由在XML文件中filter-mapping的順序決定的;如果沒有下一個過濾器就指向服務器
應用:將Request請求信息進行過濾用來解決中文亂碼問題
1.創建過濾器類:
package com.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest; public class MyFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //將request增強 //創建一個request的對象,因為這裏是ServletRequest的request不能使用HTTPServletRequest的特有的傳遞doGet,doPost方法,所以要向下轉型 HttpServletRequest req = (HttpServletRequest) request; SuperHttpServletRequest superRequest = new SuperHttpServletRequest(req); chain.doFilter(superRequest, response); } @Override public void destroy() { } }
2.創建重寫類,重寫getParameter方法,使得該方法加強
package com.filter; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class SuperHttpServletRequest extends HttpServletRequestWrapper { /** * 實現的是類而不是接口的好處:實現接口就要實現其所有的方法 * 而類只需要重寫就行了,因為繼承類的話會自動繼承父類的所有方法 * ServletRequest是頂層接口,裏面定義了getParameter方法,而HttpServletRequestWrapper是第一個實現該接口 * 所有方法的類,所以直接繼承該類重寫方法就行了 */ private HttpServletRequest request; public SuperHttpServletRequest(HttpServletRequest request) { super(request); //將父類中的request賦值給該類中的request this.request=request; } @Override public String getParameter(String name) { //獲取請求方式 String method = request.getMethod(); //如果是get請求,get請求的解決中文亂碼的方式是用utf-8重構字符串 if("get".equalsIgnoreCase(method)) { String parameter = super.getParameter(name); try { parameter = new String(parameter.getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return parameter; //如果是post請求,post請求解決中文亂碼的方式是重新設置字符緩沖區的編碼格式 }else if("post".equalsIgnoreCase(method)) { try { request.setCharacterEncoding("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return request.getParameter(name); } }
Filter過濾器(Servlet)