JavaWeb 敏感词汇过滤器
生活随笔
收集整理的這篇文章主要介紹了
JavaWeb 敏感词汇过滤器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1,基本功能
????????在提交數(shù)據時,常常需要檢查數(shù)據中是否含有敏感詞匯,有的話,需要屏蔽敏感詞匯
2,實現(xiàn)原理
? ? ? ? 我們可以使用Filter過濾器,對數(shù)據進行檢查與處理,將處理完畢的數(shù)據放行。因此,在javaweb中,我們可以先在Filter中,對數(shù)據進行處理。可以使用動態(tài)代理的方式進行。
動態(tài)代理:
? ? ? ? 即在內存中形成代理類,可以對真實對象做增強操作。
3,實現(xiàn)步驟
1,對request對象進行加強,增強獲取參數(shù)相關方法
2,放行,傳遞代理對象
4,代碼實現(xiàn)
1,在src目錄下生成 敏感詞匯.txt
?
?2,過濾器代碼
先使用流加載敏感詞匯的內容,再在動態(tài)代理中,對getParameter(),getParameterMap(),
getParameterValues()三種方法做不同增強。
package Filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.awt.*; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set;@WebFilter("/*") public class SenstiveWordsFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//創(chuàng)建request的代理對象,增強getParameter方法,getParameterMap方法,getParameterValues方法ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//判斷是否是getParameter方法if(method.getName().equals("getParameter")){//增強返回值//1,獲取返回值String value = (String) method.invoke(servletRequest, args);//判斷返回值中是否為空if(value!=null){//判斷value中是否有敏感詞匯for (String str:list) {if(value.contains(str)){//如果有敏感詞匯,將敏感詞匯修改成***value=value.replaceAll(str,"***");}}}return value;}//判斷是否是getParameterMap方法else if(method.getName().equals("getParameterMap")){//增強返回值//1,獲取返回值Map<String,String[]> map= (Map<String,String[]>) method.invoke(servletRequest, args);//遍歷map集合,將其中的敏感詞匯替換Set<String> set =map.keySet();for (String key:set) {for (String value:map.get(key)) {int i=0;if(value!=null){//判斷value中是否有敏感詞匯for (String str:list) {if(value.contains(str)){//如果有敏感詞匯,將敏感詞匯修改成***map.get(key)[i]=value.replaceAll(str,"***");i++;}}}}}return map;}//判斷是否是getParameterValues方法else if(method.getName().equals("getParameterValues")){//增強返回值//1,獲取返回值String[] values=(String[]) method.invoke(servletRequest,args);//2,遍歷values數(shù)組,替換敏感詞匯for (int i=0;i<values.length;i++){if(values[i]!=null){//判斷value中是否有敏感詞匯for (String str:list) {if(values[i].contains(str)){//如果有敏感詞匯,將敏感詞匯修改成***values[i]=values[i].replaceAll(str,"***");}}}}return values;}return method.invoke(servletRequest,args);}});filterChain.doFilter(proxy_req,servletResponse);}//敏感詞匯集合private List<String> list=new ArrayList<String>();@Overridepublic void init(FilterConfig filterConfig) throws ServletException {try {//1,獲取文件真實路徑ServletContext servletContext = filterConfig.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感詞匯.txt");//2,讀取文件//使用BufferdReader字符輸入流BufferedReader br=new BufferedReader(new FileReader(realPath));//3,將文件中的每一行數(shù)據加載到list中String line=null;while ((line=br.readLine())!=null){list.add(line);}//4,關閉流br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void destroy() {} }?
總結
以上是生活随笔為你收集整理的JavaWeb 敏感词汇过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML学习笔记06-连接
- 下一篇: Java飞机大战超全版(plus版)