有時(shí)需要對網(wǎng)站內(nèi)容顯示進(jìn)行控制,防止用戶輸入非法或敏感內(nèi)容,常規(guī)的辦法是保存數(shù)據(jù)庫之前對非法內(nèi)容進(jìn)行替換,但這種方法具有局限性。
現(xiàn)在給出一種新的方法,使用過濾器。在Web服務(wù)器獲得用戶請求之前,過濾器可以訪問該請求,在Web服務(wù)器將輸出響應(yīng)給用戶之前,過濾器還可以訪問該響應(yīng),可以在過濾器中將該響應(yīng)轉(zhuǎn)換為自定義響應(yīng),最后將過濾后的自定義響應(yīng)返回給客戶端。
關(guān)于FilterChain對象的doFilter方法,通俗的講doFilter就像一扇門,用戶請求(request)在過濾器執(zhí)行一些操作后,通過doFilter方法,到達(dá)下一個(gè)過濾器或者直接是資源文件,Web服務(wù)器收到請求后響應(yīng)(response)用戶,response又會(huì)通過doFilter這扇門回到之前過濾器doFilter方法中,執(zhí)行chain.doFilter()方法后面的語句,在這時(shí),可以對response進(jìn)行修改,比如將敏感字符替換。
過濾器圖解:

下面是一個(gè)自定義響應(yīng)對象的類,繼承了HttpServletResponseWrapper類,里面重寫了toString方法,getWriter方法。
package com.yykj.servlet;import javax.servlet.http.*;import java.io.CharArrayWriter;import java.io.PRintWriter;public class Wrapper extends HttpServletResponseWrapper { private CharArrayWriter charArrayWriter;//字符數(shù)組輸出流 public Wrapper(HttpServletResponse response){ super(response);//父類構(gòu)造方法 this.charArrayWriter = new CharArrayWriter(); } @Override public String toString(){ return charArrayWriter.toString(); } @Override public PrintWriter getWriter(){//從服務(wù)器傳出過程中會(huì)調(diào)用 return new PrintWriter(charArrayWriter);//使得輸出流為charArrayWriter類型 }}過濾器代碼:package com.yykj.servlet;import javax.servlet.*;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;public class CTFilter implements Filter { private FilterConfig filterConfig = null; public void init(FilterConfig filterConfig){ System.out.println("init"); this.filterConfig = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException{ response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); Wrapper wrapper = new Wrapper((HttpServletResponse) response);//自定義響應(yīng) filterChain.doFilter(request, wrapper);//如果wrapper不傳進(jìn)去,他的字符串就為空,getWriter在這傳遞過程中調(diào)用 String resStr = wrapper.toString().trim(); String newStr = ""; if (resStr.indexOf("法輪功") > 0) {//簡單的非法字符替換 newStr = resStr.replace("法輪功", "***"); } out.println(newStr); } public void destroy(){ this.filterConfig = null; }}
新聞熱點(diǎn)
疑難解答