JavaEE 使用Filter实现敏感词汇过滤器
生活随笔
收集整理的這篇文章主要介紹了
JavaEE 使用Filter实现敏感词汇过滤器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態代理實現敏感詞匯過濾器
使用動態代理增強request的getParameter(),getParameterMap()和getParameterValues()這三個方法,以達到過濾敏感詞匯的效果
##步驟
定義敏感詞匯的文件txt
定義敏感詞匯過濾器Filter類
import org.apache.commons.beanutils.BeanMap;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.BufferedReader; 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.*;/*** 敏感詞匯過濾器*/ @SuppressWarnings("all") @WebFilter("/*") public class SensitiveWordsFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//創建代理對象ServletRequest proxy_request = (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;}if (method.getName().equals("getParameterMap")) {//增強getParameterMap方法//獲取參數//定義一個新的map集合Map<String, String[]> newMap = new HashMap<String, String[]>();Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);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)) {values[i] = values[i].replaceAll(s, "***");newValues[i] = values[i];} else {newValues[i] = values[i];}}}}newMap.put(key, newValues);}return newMap;}if (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, "***");break;} else {newValues[i] = values[i];}}}return newValues;}}return method.invoke(req, args);}});//放行chain.doFilter(proxy_request, 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 FileReader(realPath));String line;while ((line = br.readLine()) != null) {//添加文件內容到集合list.add(line);}} catch (Exception e) {e.printStackTrace();}}}注意事項:
request調用getParameter()方法時,返回的是String
調用getParameterMap方法時,返回的是Map集合,鍵是String,值是String類型的數組
調用getParameterValues()方法時,返回的是一個String類型的數組
######定義測試類TestServlet
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; import java.util.Set;@WebServlet("/TestServlet") public class TestServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*String tname = request.getParameter("tname");String tmsg = request.getParameter("tmsg");*/String[] tnames = request.getParameterValues("tname");String[] tmsgs = request.getParameterValues("tmsg");/* Map<String, String[]> map = request.getParameterMap();//遍歷mapSet<String> keySet = map.keySet();for (String key : keySet) {String[] values = map.get(key);System.out.println(key + "---" + values[0]);}*/System.out.println(tmsgs[0]);System.out.println(tnames[0]);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }瀏覽器直接訪問測試的Servlet
控制臺的結果
總結
以上是生活随笔為你收集整理的JavaEE 使用Filter实现敏感词汇过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp 判断数组等于_如何在 ASP.N
- 下一篇: mpAndroidchart 坐标和图表