前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zuul 请求重写

zuul 请求重写

作者头像
用户1418372
发布2019-07-03 11:55:08
1.1K0
发布2019-07-03 11:55:08
举报
文章被收录于专栏:清晨我上码清晨我上码

由于在zuul中请求的request.getInputStream(),只能读取一次,所以在分析请求内容后,会关闭stream流,所以后续无法获取。

这里给出解决方法核心为重写request。

1、 单独项目使用

代码语言:javascript
复制
例如filter中获取一次请求以后body,我们在controller想再次获取请求body。request.getInputStream()返回的是ServletInputStream,此方法没有实现流的mark/reset方法,我们在filter中读取以后无法对流进行复位
*BodyReaderHttpServletRequestWrapper .java

代码实现如下:

代码语言:javascript
复制
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
    private byte[] body;
    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        try {
            body = StreamUtils.getByteByStream(request.getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public BufferedReader getReader()  {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }

    @Override
    public ServletInputStream getInputStream()  {
        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()  {
                return bais.read();
            }
        };
    }
}
  • StreamUtils.java
代码语言:javascript
复制
public class StreamUtils {
    public static byte[] getByteByStream(InputStream is) throws Exception {
        byte[] buffer = new byte[1024];
        int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while ((len = is.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
        bos.flush();
        return bos.toByteArray();
    }
}
  • 使用:
  1. filter 中使用
代码语言:javascript
复制
public class MyFilter implements Filter {
    public void destroy() {
        // TODO Auto-generated method stub
    }

    public void doFilter(ServletRequest arg0, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest request = (HttpServletRequest) arg0;
        ServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(request);
        //测试在filter中获取一次
        InputStream is = requestWrapper.getInputStream();
        String body = IOUtils.toString(inp);
        // 关闭文件输入流
        is.close();
        // 关闭输出流
        out.close();
        chain.doFilter(requestWrapper, response);
    }
    public void init(FilterConfig arg0) throws ServletException {
    }
}
  1. controller中使用
代码语言:javascript
复制
@RequestMapping(value="/test",method=RequestMethod.POST) public void downloadsql(HttpServletRequest request, HttpServletResponse response){ 
//正常使用即可
}

2、 zuul中使用,和filter类似

  1. 增加一个前置过滤器
代码语言:javascript
复制
public class PreRequest extends ZuulFilter {
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return FORM_BODY_WRAPPER_FILTER_ORDER +1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {

        RequestContext.getCurrentContext().setRequest(new BodyReaderHttpServletRequestWrapper( RequestContext.getCurrentContext().getRequest()) );
        return null;
    }

}
  1. controller 和上面相同即可
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 由于在zuul中请求的request.getInputStream(),只能读取一次,所以在分析请求内容后,会关闭stream流,所以后续无法获取。
  • 这里给出解决方法核心为重写request。
    • 1、 单独项目使用
      • 2、 zuul中使用,和filter类似
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档