Jetty:如何保护 web.xml 中的 websocket 连接?

Jetty: how to secure websocket connection in web.xml?

我按照 this article 创建了最简单的 websocket echo 应用程序。尽管文章是关于 Glassfish 的,但我在 Jetty 9 下成功 运行 我的应用程序,因为它们在文章中使用标准 javax.websocket API。 它工作得很好,但现在我想保护 websocket 连接。我四处搜索,发现大多数示例都是作为独立的 Java 应用程序编写的(使用 public static void main() 方法)。他们创建新的 ConnectionFactory 并从他们的代码启动服务器(例如 here)。

但我想 运行 我的应用程序在 Jetty 下作为一个容器,所以我只想在 web.xml 或其他东西中指定一些选项,以保护我的连接。所以我找到了 this 文章并修改了我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Protected resource</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
        </web-resource-collection>

        <!-- https -->
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
</web-app>

问题是它不起作用。可能是因为文章又是关于 Glassfish 的。

它是如何不起作用的:

Illegal character 0x16 in state=START for buffer HeapByteBuffer

badMessage: 400 Illegal character 0x16 for HttpChannelOverHttp

所以..我做错了什么?如何通过 Jetty 或应用程序配置制作安全的 websocket?

您描述的安全约束标记主要用于在应用服务器中指定 BASIC 身份验证模式。

我猜您想启用 HTTPS 而不是身份验证。要启用 HTTPS,您可以阅读这篇文章:https://wiki.eclipse.org/Jetty/Howto/Configure_SSL