javaEE学习笔记—————利用代理模式和过滤器增强对象功能完成敏感词汇过滤功能
生活随笔
收集整理的這篇文章主要介紹了
javaEE学习笔记—————利用代理模式和过滤器增强对象功能完成敏感词汇过滤功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.需求:
- 2.分析:
- 3.增強對象的功能:
- 4.完成相關的功能實現
- 4.1了解一波代理模式
- 4.2Coding
- 4.3可能會遇到的報錯
- 5效果
1.需求:
在日常的生活中大家也知道存在很多侮辱性的詞匯,LOL大家很多小伙伴都玩過吧。經常會看見你**你個**這樣字幕,那么是怎么實現的呢,下面我們就完成這樣一個類似的功能1. 對用戶存入將要存入數據庫的信息進行敏感詞匯過濾2. 把敏感的詞匯寫在《敏感詞匯.txt》3. 如果是敏感詞匯,替換為 ***2.分析:
1. 對request對象進行增強。增強獲取參數相關方法2. 放行。傳遞代理對象3.增強對象的功能:
設計模式:一些通用的解決固定問題的方式1. 裝飾模式2. 代理模式概念:1. 真實對象:被代理的對象2. 代理對象:3. 代理模式:代理對象代理真實對象,達到增強真實對象功能的目的實現方式:1. 靜態代理:有一個類文件描述代理模式2. 動態代理:在內存中形成代理類實現步驟:1. 代理對象和真實對象實現相同的接口2. 代理對象 = Proxy.newProxyInstance();3. 使用代理對象調用方法。4. 增強方法增強方式:1. 增強參數列表2. 增強返回值類型3. 增強方法體執行邏輯4.完成相關的功能實現
4.1了解一波代理模式
其實不僅僅代理模式能夠完成增強功能的效果裝飾模式也可以,這里我們就來理解一波代理模式。先問一個問題大家都買過電腦吧,那大家是在哪里買的?以聯想為例,大家每個人都是去聯想的總公司才能買到電腦嗎,顯然并不是。我們通過一些代理商也可以買到電腦
4.2Coding
/*** 敏感詞匯過濾器*/ @WebFilter("/*") public class SensitiveWordsFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//1.創建代理對象,增強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;}//判斷方法名是否是 getParameterMapif (method.getName().equals("getParameterMap")) {//增強getParameterMap方法//獲取參數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數組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;}//判斷方法名是否是 getParameterValueif (method.getName().equals("getParameterValues")) {//獲取參數的值String[] values = (String[]) method.invoke(req, args);//定義一個新數組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, "***");} else {newValues[i] = values[i];}}}return newValues;}}return method.invoke(req,args);}});//2.放行chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<String>();//敏感詞匯集合public 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.將文件的每一行數據添加到list中String line = null;while((line = br.readLine())!=null){list.add(line);}br.close();// System.out.println(list);}catch (Exception e){e.printStackTrace();}}public void destroy() {}}4.3可能會遇到的報錯
java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap
在java中對象直接進行等于操作的時候會關聯原對象 原對象不可以進行修改 那新參數也無法進行修改
剛開始我在獲取Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);時沒有 Map<String, String[]> newMap = new HashMap<String, String[]>();就會報錯。大家在寫的過程中也可以嘗試下
5效果
點擊提交查看
總結
以上是生活随笔為你收集整理的javaEE学习笔记—————利用代理模式和过滤器增强对象功能完成敏感词汇过滤功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux日志服务器配置在哪个文件,Li
- 下一篇: NDK编译错误expected spec