关于servlet返回的几个问题

来源:互联网 发布:营销qq加好友软件 编辑:程序博客网 时间:2024/06/07 18:27

近日参与网关服务的开发,需要将用户的请求和返回的结果做一个转发,类似于一个代理服务器。当然,合适的转发就不仅仅转发http的entity部分,对http头部的各个字段也要完整地转发。当然,spring提供了HttpServletRequest和HttpServletResponse来帮助我们解决问题,其实就是一个servlet,对于返回,只需要将头部塞到response里面即可。http的body部分,使用输出流来解决。输出流有两种,字节和字符输出流。要保证使用输出流的一致性,如果报类似于IOException  WRITE这样的错误,将输出流改为字节输出流,反之,改为字符输出流。servlet返回的内容大小头部中与content length有关,凡是包含了该字段的http请求,其body一律按该数值读取,不论实际的body多大。转发过程中,有些转发的response中包含了该字段,而在网关服务器上我们会对返回做一些处理,塞一些字段到http body中,为了转发response能够正确读取,就使用了setContentLength方法,responseBody.length()确定其长度,使用

                ServletOutputStream out = response.getOutputStream();byte[] dataByteArr = responseBody.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换out.write(dataByteArr);out.flush();out.close();
但是,仍然传输失败。responseBody是一个字符串,其中有一些boolean类型的字段,responseBody.length()的值比传输的值大。考虑后发现,传输过程中,已utf-8编码,而responseBody.length()取值的时候,里面的"success":true中的true的长度和utf-8编码的大小是不一样的。后改为:

byte[] data = responseBody.getBytes("UTF-8");