J2EE Filter中修改request内容

  最近在做一个微信相关的网站,很多地方涉及到微信表情的输入,导致内容无法插入到数据库,虽然有用到一个表情过滤的工具类,但是需要过滤的地方比较多,于是想到在过滤器中过滤用户请求的内容。  

  request这个方法里,有getParameter(String name)、getParameterValues(String name)、getParameterNames()以及getParameterMap()是可以获得参数键值对的,Servlet自带的HttpServletRequest的方法是不支持修改用户请求类型的,我也尝试过直接去修改,都以异常收尾,后面我想到HttpServletRequest既然是一个接口,那我去实现它,然后直接用我们实现的类传到filterChain.doFilter(servletRequest, servletResponse)里面不也可以么,可是要实现的方法也太多了,好在ServletApi提供了一个class HttpServletRequestWrapper封装了这些方法,我们可以通过extends这个类,然后重写一些重要的方法来修改用户的请求,下面就开始我们的改造吧。 

  1.新建一个Filter,我给这个类命名为RequestFilter

public class RequestFilter implements Filter {
    private final Logger logger = LoggerFactory.getLogger(RequestWrapper.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
    }

    @Override
    public void destroy() {
    }

  
}
  2.新建一个类,通过继承HttpServletRequestWrapper来实现request的作用。
class RequestWrapper extends HttpServletRequestWrapper {
        
    }

  3.新建一个private属性:private Map<String, String[]> paramMap;用这个paramMap来存储用户请求的内容,并且在构造方法中初始化paramMap,初始化的方法为

paramMap = new HashMap<>();//定义
paramMap.putAll(request.getParameterMap());//初始化

 

  4.重写上面提到的四个方法,

 @Override
        public String getParameter(String name) {
            String[] values = paramMap.get(name);
            if (values == null || values.length == 0) {
                return null;
            }
            return values[0];
        }

        @Override
        public String[] getParameterValues(String name) {
            return paramMap.get(name);
        }

        @Override
        public Enumeration<String> getParameterNames() {
            return new Enumeration<String>() {
                private Iterator<String> iterator = paramMap.keySet().iterator();

                @Override
                public boolean hasMoreElements() {
                    return iterator.hasNext();
                }

                @Override
                public String nextElement() {
                    return iterator.next();
                }
            };
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            return paramMap;
        }

  5.通过以上这些操作,我们就可以实现对用户请求进行修改。

  

public class RequestFilter implements Filter {
    private final Logger logger = LoggerFactory.getLogger(RequestWrapper.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        RequestWrapper requestWrapper = new RequestWrapper(request);
        if (request.getMethod().equals("POST")) {
            logger.debug("开始过滤请求中的表情字符");
            requestWrapper.emojiFilter();
        }
        filterChain.doFilter(requestWrapper, servletResponse);
    }

    @Override
    public void destroy() {
    }

    class RequestWrapper extends HttpServletRequestWrapper {
        private Map<String, String[]> paramMap;

        RequestWrapper(HttpServletRequest request) {
            super(request);
            paramMap = new HashMap<>();
            paramMap.putAll(request.getParameterMap());
        }

        @Override
        public String getParameter(String name) {
            String[] values = paramMap.get(name);
            if (values == null || values.length == 0) {
                return null;
            }
            return values[0];
        }

        @Override
        public String[] getParameterValues(String name) {
            return paramMap.get(name);
        }

        @Override
        public Enumeration<String> getParameterNames() {
            return new Enumeration<String>() {
                private Iterator<String> iterator = paramMap.keySet().iterator();

                @Override
                public boolean hasMoreElements() {
                    return iterator.hasNext();
                }

                @Override
                public String nextElement() {
                    return iterator.next();
                }
            };
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            return paramMap;
        }

        private void resetParamMap(String key, String[] value) {
            paramMap.put(key, value);
        }

        //过滤表情
        void emojiFilter() {
            for (String key : paramMap.keySet()) {
                String[] valueSet = paramMap.get(key);
                if (BeanUtil.nonNull(valueSet) && valueSet.length > 0) {
                    logger.debug("过滤前:" + valueSet[0]);
                    valueSet[0] = EmojiFilter.filterEmoji(valueSet[0]);
                    logger.debug("过滤后:" + valueSet[0]);
                    resetParamMap(key, valueSet);
                }
            }
        }
    }
}

 


 
 

 

posted @ 2017-08-12 00:30  lifeLearner  阅读(2312)  评论(0编辑  收藏  举报