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

时间:2015-04-02 15:59:44

标签: websocket jetty

我跟着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的。

它是如何工作的:

  • 我的IDE(IDEA)在<security-constraint>中显示红色的所有标记,这意味着架构验证失败,这些标记无法包含在<security-constraint>
  • 当我尝试通过HTTPS打开index.html时,我在浏览器中收到错误ssl_error_rx_record_too_long,并且Jetty输出中也有两个错误:

Illegal character 0x16 in state=START for buffer HeapByteBuffer

badMessage: 400 Illegal character 0x16 for HttpChannelOverHttp

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

1 个答案:

答案 0 :(得分:1)

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

我想您要启用HTTPS而不是身份验证。要启用HTTPS,您可以按照以下文章进行操作:https://wiki.eclipse.org/Jetty/Howto/Configure_SSL