敏感詞彙過濾
-
需求
- 對UserCRUD_case案例中錄入的數據進行敏感詞彙的過濾
- 敏感詞彙參考《敏感詞彙.txt》
- 若是敏感詞彙,則替換爲***
-
分析
- 在進行過濾前後,所獲取的request請求對象是同一個,所以我們可以對該對象進行一些修改,然後繼續使用該對象
- 由於request對象中默認不存在修改數據的方法,所以關鍵是對request對象的getParameter方法進行增強;產生一個新的request對象
- 放行。傳遞代理對象
-
如何增強對象的功能?
- 設計模式 :一些通用的解決固定問題的模式
- 可以增強對象功能的設計模式
- 裝飾模式
- 代理模式
- 概念
- 真實對象 :被代理的對象
- 代理對象
- 代理模式 :代理對象來代理真實對象,來實現增強真實對象功能的目的
- 實現方式
- 靜態代理 :有一個類文件藐視代理模式
- 動態代理 :在內存中形成代理類
- 實現步驟
- 代理對象和真實對象實現相同的接口
- 代理對象 = Proxy.newProxyInstance();
- 使用代理對象調用方法
- 增強方法
- 增強方式
- 增強參數列表
- 增強返回值類型
- 增強方法體執行邏輯
- 實現步驟
- 概念
- 可以增強對象功能的設計模式
- 設計模式 :一些通用的解決固定問題的模式
-
本次案例只需要將request請求對象中的敏感詞彙替換,然後封裝到新的request對象中即可,所以可以選擇使用增強返回值類型方法的代理模式來實現
-
實現getParmeter方法增強的代碼:
package web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
/**
* 敏感詞彙過濾器
*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 1.創建代理對象,增強request的getParameter方法
ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 增強getParameter方法
if (method.getName().equals("getParameter")){
// 增強返回值
String value = (String) method.invoke(req, args);
if (value != null){
for(String str : list){
if(value.contains(str)){
value = value.replaceAll(str, "***");
}
}
}
return value;
}
return method.invoke(req, args);
}
});
chain.doFilter(proxy_req, resp);
}
private List<String> list = new ArrayList<String>(); //敏感詞彙集合
public void init(FilterConfig config) throws ServletException {
try {
// 獲取文件的真實路徑
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感詞彙.txt");
// 讀取文件
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"utf-8"));
// 將文件的每一行添加到list集合中
String line = null;
while((line = br.readLine()) != null){
list.add(line);
}
br.close();
System.out.println(list);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}