美文网首页
用HttpServletRequestWrapper来修改htt

用HttpServletRequestWrapper来修改htt

作者: 欢乐时光欢乐你我 | 来源:发表于2019-03-01 14:15 被阅读4次

    过滤的效果:

    过滤前

    {
    "version" : "11111111",
    "data": {
       "heartbeat_time": 1468471315134
    }
    }
    

    过滤后

    {"heartbeat_time":1468471315134}
    

    具体的实现代码:
    1.自定义一个过滤器

    @Component
    @ServletComponentScan
    @WebFilter(urlPatterns = "/north/*", filterName = "httpFilter")//此处的url根据实际情况而定
    public class HttpReplaceFilter implements Filter {
        private static final Set<String> ALLOW_PATHS = new HashSet<>(Arrays.asList("/serviceName"));
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            String path = ((HttpServletRequest)request).getRequestURI().substring(((HttpServletRequest) request).getContextPath().length());
            //如果是在ALLOW_PATHS的集合中,那么就允许这种请求直接通过
            if (ALLOW_PATHS.contains(path)){
                filterChain.doFilter(request, response);
            }
            //HttpServletRequest没有提供相关的set方法来修改body,所以需要用修饰类
            ServletRequest requestWrapper = new BodyRequestWrapper((HttpServletRequest) request);
    
            filterChain.doFilter(requestWrapper, response);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    2.自定义一个Http请求的修饰类

    public class BodyRequestWrapper extends HttpServletRequestWrapper {
    
        private byte[] body;
        public BodyRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            StreamUtil.readBytes(request.getReader(), "utf-8");
            //由于request并没有提供现成的获取json字符串的方法,所以我们需要将body中的流转为字符串
            String json = new String(StreamUtil.readBytes(request.getReader(), "utf-8"));
            body = getData(json).getBytes();
        }
    
        @Override
        public BufferedReader getReader() throws IOException {
            return new BufferedReader(new InputStreamReader(getInputStream()));
        }
    
        /**
         * 在使用@RequestBody注解的时候,其实框架是调用了getInputStream()方法,所以我们要重写这个方法
         * @return
         * @throws IOException
         */
        @Override
        public ServletInputStream getInputStream() throws IOException {
            final ByteArrayInputStream bais = new ByteArrayInputStream(body);
    
            return new ServletInputStream() {
                @Override
                public boolean isFinished() {
                    return false;
                }
    
                @Override
                public boolean isReady() {
                    return false;
                }
    
                @Override
                public void setReadListener(ReadListener readListener) {
    
                }
    
                @Override
                public int read() throws IOException {
                    return bais.read();
                }
            };
        }
    
        private String getData(String json){
            if (!json.contains("\"data\"")){
                return "";
            }
            ObjectMapper mapper = new ObjectMapper();
            String data = null;
            try {
                JsonNode jsonNode = mapper.readTree(json);
                data = jsonNode.get("data").toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return data;
        }
    }
    

    以上代码就可以实现将json数据过滤掉了

    相关文章

      网友评论

          本文标题:用HttpServletRequestWrapper来修改htt

          本文链接:https://www.haomeiwen.com/subject/imjduqtx.html