Servlet 怎么样才能得到完整的 Http 请求输入流

本贴最后更新于 2981 天前,其中的信息可能已经物是人非

象这样只能得到请求体,不能获取到包括头部的整个二进制数据

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream());
	    InputStream is = req.getInputStream();
        osw.write(Constant.TEST_WEBSOCKET_PAGE);
        osw.flush();
    }

处理 Http 是 Web 容器的工作,AJP 将数据传给 Servlet 就已经是解析过的对象,因此不能直接获取到原本的内容

自己再拼接回去咯 😆

GET http://www.ruanyifeng.com/static/themes/theme_scrapbook/theme_scrapbook.css HTTP/1.1
Host: www.ruanyifeng.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
Accept: text/css,*/*;q=0.1
Referer: http://www.ruanyifeng.com/blog/2016/08/http.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: _ga=GA1.2.1640937992.1474458063
    public static final byte[] PROTOCOL_BYTES = " HTTP/1.1\r\n".getBytes();
    public static final byte[] CRLF_BYTES = "\r\n".getBytes();
    public static final byte BLANK_BYTE = ' ';
    public static final byte[] COLON_BYTES = ": ".getBytes();
    public static final byte QUESTION_BYTE = '?';
	
    public byte[] getRequestRaw(HttpServletRequest req) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        // header values
        bufferWriteBytesFromStringAllowNull(buffer, req.getMethod());
        buffer.write(BLANK_BYTE);
        bufferWriteBytesFromStringAllowNull(buffer, req.getRequestURL().toString());
        buffer.write(QUESTION_BYTE);
        bufferWriteBytesFromStringAllowNull(buffer, req.getQueryString());
        buffer.write(PROTOCOL_BYTES);
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = req.getHeader(headerName);
            buffer.write(headerName.getBytes());
            buffer.write(COLON_BYTES);
            bufferWriteBytesFromStringAllowNull(buffer, headerValue);
            buffer.write(CRLF_BYTES);
        }
        buffer.write(CRLF_BYTES);
        // body values
        InputStream inputStream = req.getInputStream();
        int nRead;
        byte[] data = new byte[1024];
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        buffer.flush();
        byte[] byteArray = buffer.toByteArray();
        return byteArray;
    }

    public String getRequestBase64(HttpServletRequest req) throws IOException {
        byte[] rawBytes = getRequestRaw(req);
        return Base64.getEncoder().encodeToString(rawBytes);
    }

    public String encodeBase64BytesString(String base64Bytes) {
        byte[] bytes = Base64.getDecoder().decode(base64Bytes);
        StringBuffer stringBuffer = new StringBuffer();
        for (byte b : bytes) {
            stringBuffer.append((char) b);
        }
        return stringBuffer.toString();
    }

    public void bufferWriteBytesFromStringAllowNull(ByteArrayOutputStream byteArrayOutputStream, String string) throws IOException {
        if (string != null) {
            if (string.getBytes() != null) {
                byteArrayOutputStream.write(string.getBytes());
            }
        }
    }

那个 ByteArrayOutputStream 应该可以共用,需要吧所有的数据都给转到 byte[]

问一下那个 bufferWriteBytesFromStringAllowNull 应该是是不是写成继承扩展比较好,而不是调用自身

消息同步不会写,想想还是算了。。。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Servlet
    21 引用 • 29 回帖
  • HTTP
    75 引用 • 128 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zonghua
    作者

    ⚓️

  • 其他回帖
  • zonghua
    作者

    🚑

  • zonghua
    作者

    “Jetty 可以同时处理大量连接而且可以长时间保持这些连接”

  • zonghua
    作者

    1474638673580

    getMethod() getRequestURL()
    getHost()
    getHeader()
    getReader()

    然后又将他们拼回去 😆

    1 回复
  • 查看全部回帖

推荐标签 标签

  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 58 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 339 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 241 关注
  • 导航

    各种网址链接、内容导航。

    40 引用 • 173 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    6 引用 • 63 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 547 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 588 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 137 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • gRpc
    11 引用 • 9 回帖 • 73 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 743 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 474 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    6 引用 • 14 回帖 • 2 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 303 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 407 关注