Filter动态代理敏感词汇过滤
Filter敏感詞匯過濾
動態(tài)代理增強對象的功能
設(shè)計模式:通用的解決固定問題的方式
1. 裝飾模式
2. 代理模式
【概念】
真實對象:被代理的對象
代理對象
代理模式:代理對象代理真實對象,達(dá)到增強莫實對象功能的目的
【實現(xiàn)方式】
靜態(tài)代理:有一個類文件描述代理模式
動態(tài)代理:在內(nèi)存中形成代理類
【動態(tài)代理實現(xiàn)步驟】
代理對象和真實對象實現(xiàn)相同的接口
代理對象 = Proxy. newProxyInstance();
使用代理對象調(diào)用方法
增強方法
增強方式
增強參數(shù)列表
增強返回值類型
增強方法體執(zhí)行邏輯
動態(tài)代理敏感詞匯過濾實現(xiàn)
1.創(chuàng)建敏感詞匯列表
此處一定要注意txt文件的存放路徑,否則可能導(dǎo)致輸入流無法讀取文件
【放在src下】
/WEB-INF/classes/敏感詞匯.txt
【放在src下的web下的filter中】
/WEB-INF/classes/com.iqqcode.userquary.web.filter/敏感詞匯.txt
【txt中自定義敏感詞匯】
2. 定義敏感詞匯過濾器Filter類
SensitiveListener
package com.iqqcode.userquary.web.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; import java.io.BufferedReader; import java.io.FileReader; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.*;/*** @Author: Mr.Q* @Date: 2020-02-28 20:16* @Description:Filter敏感詞匯過濾器*/ @WebFilter("/*") public class SensitiveListener implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//1.創(chuàng)建代理對象,增強getParameter方法ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//增強getParameter方法//判斷是否是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;}//判斷方法名是否是 getParameterValueif (method.getName().equals("getParameterValues")) {//獲取參數(shù)的值String[] values = (String[]) method.invoke(req, args);//定義一個新數(shù)組String[] newValues = new String[values.length];//遍歷數(shù)組if (values != null) {for (int i = 0; i < values.length; i++) {for (String s : list) {if (values[i].contains(s)) {newValues[i] = values[i].replaceAll(s, "***");break;} else {newValues[i] = values[i];}}}return newValues;}}//判斷方法名是否是getParameterMapif (method.getName().equals("getParameterMap")) {//增強getParameterMap方法//獲取參數(shù)Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);//定義一個新的map集合Map<String, String[]> newMap = new HashMap<String, String[]>();Set<String> keySet = map.keySet();for (String key : keySet) {String[] values = map.get(key);//定義一個String數(shù)組String[] newValues = new String[values.length];if (values != null) {for (int i = 0; i < values.length; i++) {//遍歷集合for (String s : list) {if (values[i].contains(s)) {newValues[i] = values[i].replaceAll(s, "***");break;} else {newValues[i] = values[i];}}}}newMap.put(key, newValues);}return newMap;}return method.invoke(req,args);}});//2.放行chain.doFilter(proxy_req, resp);}//敏感詞匯集合private List<String> list = new ArrayList<String>();@Overridepublic void init(FilterConfig config) throws ServletException {try{//1.獲取文件真實路徑ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感詞匯.txt");//2.讀取文件BufferedReader br = new BufferedReader(new FileReader(realPath));//3.將文件的每一行數(shù)據(jù)添加到list中String line = null;while((line = br.readLine())!=null){list.add(line);}br.close();System.out.println(list);}catch (Exception e){e.printStackTrace();}}@Overridepublic void destroy() { } }注意事項:
在使用BufferedReader字符緩沖輸入流讀取文件時,要注意編碼問題
在放行請求時,調(diào)用chain的doFilter方法,要注意把代理對象傳進(jìn)去,而不是真實對象
chain.doFilter(proxy_req, resp);一定要注意返回值的類型
-
request調(diào)用getParameter()方法時,返回的是String
-
調(diào)用getParameterMap方法時,返回的是Map集合,鍵是String,值是String類型的數(shù)組
-
調(diào)用getParameterValues()方法時,返回的是一個String類型的數(shù)組
3.測試
定義TestServlet類測試
@WebServlet("/testSensitiveServlet") public class TestSensitiveServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name = request.getParameter("name");String msg = request.getParameter("msg");System.out.println(name + " : " + msg);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }http://localhost:8080/UserQuery/testSensitiveServlet?name=張三&msg=小雞是菜雞
在信息添加功能中驗證
SensitiveListener放在servlet包下即可以攔截項目中的敏感詞匯信息
【參考文章】:JavaEE 使用Filter實現(xiàn)敏感詞匯過濾器
總結(jié)
以上是生活随笔為你收集整理的Filter动态代理敏感词汇过滤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解析发展方向,定格人生道路
- 下一篇: 平板xmind怎么添加父主题_xmind