多学习。

过滤敏感词汇

要点:

  如果是通过getParameter()获取值,可直接修改值,利用代理模式返回过滤敏感词汇的值

  如果是通过getParameterMap()获取的map不能修改原map,否则抛出异常:java.lang.IllegalStateException: 不允许修改锁定的参数映射,需要一个新的map。

代码:

    

复制代码
package com.czy.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
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.HashMap;
import java.util.Map;

@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
    ArrayList<String> words = new ArrayList<>();

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        ServletRequest request = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if(method.getName().equals("getParameterMap")){
                    Map<String,String[]> map = (Map<String,String[]>)method.invoke(req,args);
                    HashMap<String,String[]> re_map = new HashMap<>();
                    for(String key : map.keySet()){
                        String[] values = map.get(key);
                        for(String word : words) {
                          values[0] = values[0].replaceAll(word,"***");
                        }
                        re_map.put(key,values);
                    }
                    return re_map;
                }else if(method.getName().equals("getParameter")){
                    String value = (String)method.invoke(req,args);
                    for(String word : words)
                        value = value.replaceAll(word,"***");
                    return value;
                }
                return  method.invoke(req,args);
            }
        });

        chain.doFilter(request,resp);
    }

    public void init(FilterConfig config) throws ServletException {
        ServletContext servletContext = config.getServletContext();
        String path = servletContext.getRealPath("/WEB-INF/classes/SensitiveWords.txt");

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path),"utf-8"));
            String line;
            while( (line = reader.readLine()) != null )
                words.add(line);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
复制代码

 

posted @   czyaaa  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示