weixin_39280680 2019-05-26 22:10 采纳率: 0%
浏览 217

《Java EE 程序设计》作者:郝玉龙 书中程序3-18运行代码后,结果是错的

3.5.4 服务器推送
  3.1节已经简单介绍了HTTP 1.1协议。随着互联网的快速发展,HTTP 1.1协议得到了迅猛发展,但当一个页面包含了数十个请求时,HTTP 1.1协议的局限性便暴露了出来:

  • 每个请求需要单独建立与服务器的连接,浪费资源。
  • 每个请求与响应都需要添加完整的头信息,应用数据传输效率较低。
  • 默认没有进行加密,数据在传输过程中容易被监听与篡改。   HTTP 2正是为了解决HTTP 1.1暴露出来的问题而诞生的。HTTP 2最大的特点是:不会改动HTTP 的语义、HTTP方法、状态码、URI及首部字段等核心概念,而是致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。一些知名的网站如www.baidu.com已经开始全面支持HTTP 2。   HTTP 1.1协议传输的主要是文本信息,而HTTP 2把HTTP协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息,并行地在同一个TCP连接上双向交换消息。例如,客户端使用HTTP 2协议请求页面http://www.163.com,则页面上所有的资源请求都是通过客户端与服务器之间的一条TCP连接完成请求和响应的。   另外HTTP 2新增的一个强大的功能,就是服务器可以对一个客户端请求发送多个响应。换句话说,服务器除了对最初请求的响应外,还可以额外向客户端推送资源,而无须客户端明确地请求。例如,当客户端浏览器请求一个HTML文件,服务器已经能够知道客户端接下来要请求页面中链接的其他资源(如logo图片、css文件等)了,因此将自动推送这些资源给客户端而不需要等待浏览器得到HTML文件后解析页面再发送资源请求。服务器推送有一个很大的优势便是可实现客户端缓存。对于相同的资源,客户端将可以直接在本地缓存中读取。由于HTTP 2可主动向服务器端推送数据,目前各大浏览器出于安全考虑,仅支持安全连接下的HTTP 2,因此HTTP 2目前在实际使用中,只用于HTTPS协议场景下。   在最新的Servlet 4.0中,也提供了对HTTP 2的推送资源(push)特性的支持。   下面通过一个示例来演示如何在HTTP 2下向客户端推送资源。代码如程序3-18所示。   程序3-18:TestServlet.java    @WebServlet(name = "TestServlet", urlPatterns = {"/TestServlet"}) @ServletSecurity(httpMethodConstraints={ @HttpMethodConstraint(value="GET", transportGuarantee=CONFIDENTIAL) }) public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { PushBuilder pushBuilder = req.newPushBuilder().path("my.css"); pushBuilder.push(); res.getWriter().println("HTTP2 TestHello"); } }      程序说明:调用HttpServletRequest 的newPushBuilder获得请求的PushBuilder对象,并调用path方法进行填充,最后调用PushBuilder的push方法将资源对象输出到客户端。注意Servlet组件多了注解@ServletSecurity,表示Servlet仅运行在HTTPS协议下且仅支持Get方法。   注意在运行程序之前需要首先在服务器端准备推送的资源my.css。代码如程序3-19 所示。   程序3-19:my.css    body { color: blue; }      运行程序3-18,由于服务器端的Push需要运行在HTTPS协议下,NetBeans配置的GlassFish Server 5并没有配置相应的数字证书,因此浏览器会弹出如图3-24所示的警告提示信息。单击“转到此网页(不推荐)”,将得到如图3-25所示的运行结果。可以看到由于应用了服务器端Push来的my.css,结果页面中的文本已经变成蓝色。

图3-24 浏览器弹出的安全提示

图3-25 程序3-18运行结果

测试结果:
无法访问此网站 localhost 意外终止了连接。
请试试以下办法:

检查网络连接
检查代理服务器和防火墙
运行 Windows 网络诊断
ERR_CONNECTION_CLOSED

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥200 uniapp长期运行卡死问题解决
    • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
    • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
    • ¥15 乘性高斯噪声在深度学习网络中的应用
    • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
    • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
    • ¥15 C++ 头文件/宏冲突问题解决
    • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
    • ¥50 安卓adb backup备份子用户应用数据失败