protobuf实现js与java间的http通信

来源:互联网 发布:手机淘宝能微信支付吗 编辑:程序博客网 时间:2024/06/15 14:58

前端js与后端java之间的http通信我们一般采用json这种文本格式,实现非常简单,也非常容易被人抓包。protobuf协议起源于google,采用类似TLV(tag,length,value)的编码方式,输出一段字节数组,是一种二进制格式的协议。相比json格式,protobuf编码出来的内容更少,效率更高,传输过程中因为是二进制被人抓包也就更难。protobuf官方给出了很多后端语言(java,C++,python)基于protobuf的交互。前端js与后端的交互例子比较少,因为本身js在处理http请求方面也比较弱。下面提供简单demo:

proto协议文件:

message Req {    required string text = 1;}message Resp {    required string code = 1;}

前端代码:

<!DOCTYPE html><html><head><script src="./long.js"></script>   <script src="./bytebuffer.js"></script><script src="./protobuf.js"></script><script>if (typeof dcodeIO === 'undefined' || !dcodeIO.ProtoBuf) {    throw(new Error("ProtoBuf.js is not present. Please see www/index.html for manual setup instructions."));}var ProtoBuf = dcodeIO.ProtoBuf;var proto = ProtoBuf.loadProtoFile("./example.proto");var Req   = proto.build("Req");var Resp  = proto.build("Resp");var req = new Req();req.text="1";var  body = new Uint8Array(req.toArrayBuffer());var xhr = new XMLHttpRequest();xhr.open('POST', 'http://localhost:8089/xxxxx_getProtoBufReq.action', true);xhr.responseType = 'arraybuffer';xhr.onload = function(e) {if (this.status == 200) {var resp=Resp.decode(this.response);alert(resp.code);}};xhr.send(body);</script></head><body></body></html>
上面的html需要引入long.js,bytebuffer.js,protobuf.js三个文件,都可以在https://github.com/dcodeIO 的网站上找到。

参考资料:

http://mozilla.com.cn/thread-34886-1-1.html

http://web.jobbole.com/83701/


后端java代码:

public String getProtoBuf() {return "protoBuf";}public void getProtoBufReq()  {HttpServletRequest request = ServletActionContext.getRequest();InputStream input=null;ByteArrayOutputStream out=null;ServletOutputStream output=null;try {input = request.getInputStream();out = new ByteArrayOutputStream();byte by[] = new byte[1024];int len = 0;while ((len = input.read(by)) != -1) {out.write(by, 0, len);}Example.Req req=Example.Req.parseFrom(out.toByteArray());System.out.println(req.getText());Example.Resp.Builder resp=Example.Resp.newBuilder();resp.setCode("300");HttpServletResponse response = ServletActionContext.getResponse();output=response.getOutputStream();output.write(resp.build().toByteArray());} catch (Exception e) {e.printStackTrace();}finally{IOUtils.closeQuietly(output);IOUtils.closeQuietly(out);IOUtils.closeQuietly(input);}}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 痔疮引起的肛裂怎么办 痔疮手术后伤口不愈合怎么办 痔疮手术后伤口痒怎么办 肛瘘手术十五天后伤口疼怎么办 leep刀后hpv还是阳性怎么办 结肠息肉钳除后怎么办 痔疮手术后排便困难怎么办 住院未结账跑了怎么办 来月经痔疮犯了怎么办 安保压不下宫缩怎么办 肛周脓肿术后假性愈合怎么办 肛门的皱褶肿了怎么办 1月婴儿排便困难怎么办 吃完辣的痔疮肿了怎么办 肛裂怎么办兰州来医博.相信 胎儿脐带绕颈一周怎么办 郑大一附院怎么办合作医疗 痔疮包不消怎么办很疼 痔疮内扎手术后直肠窄小怎么办 2个月大的宝宝鼻塞怎么办 宝宝鼻屎比较深怎么办 来例假痔疮犯了怎么办 微医爽约过一次怎么办 炸完的薯条软了怎么办 学信网号码换了怎么办 学信网注册换手机了怎么办 学信网手机号码已被注册怎么办 学信网手机号码被注册了怎么办 去英国留学不会做饭怎么办 小米陶瓷刀钝了怎么办 橱柜的缝擦不到怎么办 悠悠球上油早了怎么办 买了没有esp的车怎么办 饥荒海难狗来了怎么办 饥荒海难拖网掉水里了怎么办 饥荒遇到了猪人怎么办 饥荒龙蝇赖在家不走怎么办 饥荒海难崩档了怎么办 gta5全是rpf文件怎么办 饥荒没有海象人营地怎么办 饥荒海滩猎犬来了怎么办