用HttpServletRequestWrapper来修改http请求中的json数据

过滤的效果:

过滤前

{
"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数据过滤掉了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,165评论 1 32
  • Getting Started Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为...
    Eva_chenx阅读 28,915评论 0 14
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,407评论 0 3
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,276评论 4 61
  • 我遇到了这个满嘴胡渣的男人,傍晚,和往常一样,我乘坐最后一班地铁,冷清且无趣。对于这座城市来说,夜生活才刚开始,可...
    l_5313阅读 636评论 2 14