简体   繁体   English

如何使用 Java 公开 WSS“安全 websocket”

[英]How to expose WSS 'secure websocket' with Java

I'm setting up a new webSocket server using Java, and want to expose it in WSS because my client side app is in HTTPS.我正在使用 Java 设置一个新的 webSocket 服务器,并希望在 WSS 中公开它,因为我的客户端应用程序使用 HTTPS。 Could you help me please请问你能帮帮我吗

I've tried to modify my web.xml but dosen't work我试图修改我的 web.xml 但不起作用

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <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>

This is my EndPoint Class这是我的端点类

@ServerEndpoint(value = "/signalisation/{username}", decoders = MessageDecoder.class, encoders = MessageEncoder.class)
public class ChatEndpoint {
    private Session session;
    private static final Set<ChatEndpoint> chatEndpoints = new CopyOnWriteArraySet<>();
    private static HashMap<String, String> users = new HashMap<>();

    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) throws IOException, EncodeException {
        System.out.println("connected");
        this.session = session;
        chatEndpoints.add(this);
        users.put(session.getId(), username);

        Message message = new Message();
        message.setFrom(username);
        message.setContent("Connected!");
        broadcast(message, message.getTo());
    }

    @OnMessage
    public void onMessage(Session session, Message message) throws IOException, EncodeException {
        message.setFrom(users.get(session.getId()));
        System.out.println("messaged");

    }

    @OnClose
    public void onClose(Session session) throws IOException, EncodeException {
        System.out.println("out");
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        // Do error handling here
    }

    private static void broadcast(Message message, String id) throws IOException, EncodeException {
        chatEndpoints.forEach(endpoint -> {
            if (endpoint.session.getId().equals(id)){
                synchronized (endpoint) {
                    try {
                        endpoint.session.getBasicRemote()
                                .sendObject(message);
                    } catch (IOException | EncodeException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public String getKeyFromMap(HashMap map, String value){

        for (Object o : map.keySet()) {
            if (map.get(o).equals(value))
                return o.toString();
        }
        return null;
    }

}

My Client Side app我的客户端应用程序

var conn = new WebSocket('ws://<IP_ADRESSE>:8080/<PATH>/signalisation/'+c);
conn.onopen = function () {
      console.log("Connected to the server");
};

My actual result is :我的实际结果是:

client.js:11 Mixed Content: The page at ' https://IP_ADRESSE:PORT/?user=blabla ' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://IP_ADRESSE:8080/PATH/signalisation/blabla'. client.js:11 混合内容:“ https://IP_ADRESSE:PORT/?user=blabla ”页面已通过 HTTPS 加载,但尝试连接到不安全的 WebSocket 端点“ws://IP_ADRESSE:8080/PATH/”信号化/blabla'。 This request has been blocked;此请求已被阻止; this endpoint must be available over WSS.此端点必须可通过 WSS 使用。

It was some month ago, but hope it helps someone with the same error.这是一个月前,但希望它可以帮助有同样错误的人。 Change ws:// to wss:// on the client side app, just before IP_ADRESSE .在客户端应用程序IP_ADRESSE ws://更改为wss:// ,就在IP_ADRESSE之前。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM