Uncaught SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS

Uncaught SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS

我正在使用 GlassFish Server 4.1/Java EE 7。在我的 web.xml 文件中,我提到了以下安全限制。

<security-constraint>
    <display-name>UserConstraint</display-name>
    <web-resource-collection>
        <web-resource-name>Provide a Name</web-resource-name>
        <description/>
        <url-pattern>/admin_side/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>ROLE_ADMIN</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

其他机构也一样。

由于 transport-guarantee 设置为 CONFIDENTIAL,与指定 URL 模式匹配的网页 /admin_side/* 运行 通过安全通道(HTTPS).

同时使用 WebSockets 如下(Java脚本),

var ws = new WebSocket("ws://localhost:8181/Context/Push");

它无法建立初始握手。浏览器在浏览器控制台上显示以下警告。

[blocked] The page at 'https://localhost:8181/Context/admin_side/Category' was loaded over HTTPS, but ran insecure content from 'ws://localhost:8080/Context/Push': this content should also be loaded over HTTPS.

Uncaught SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

当 web.xml 中的 <user-data-constraint> 部分被完全删除时,HTTP 上的网页 运行。之后,改变,

var ws = new WebSocket("ws://localhost:8181/Context/Push");

var ws = new WebSocket("ws://localhost:8080/Context/Push");

工作正常。

如何使 WebSockets 在安全通道上工作?

尝试 wss://,这表明您需要安全的 websocket 连接。浏览器会阻止您从安全页面创建不安全的连接,因为它知道由于您使用 https:// 请求页面,因此存在传输安全要求。

如果您有 WebSocket 服务器 运行 您的 Web 服务器,它可能会使用相同的安全证书,您无需执行任何操作。如果它不起作用,请检查您的 WebSocket 服务器文档,了解如何添加证书和启用 wss://.