为啥spring websocket应用看不到html并抛出404错误?

Posted

技术标签:

【中文标题】为啥spring websocket应用看不到html并抛出404错误?【英文标题】:Why does spring websocket application not see html and throws a 404 error?为什么spring websocket应用看不到html并抛出404错误? 【发布时间】:2021-11-29 01:42:44 【问题描述】:

我正在尝试根据指南使用 spring boot 和 websocket 进行聊天。

简单的配置类:

@Configuration
@EnableWebSocketMessageBroker
public class webSocketConfiguration implements WebSocketMessageBrokerConfigurer 

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) 
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry)
        registry.addEndpoint("/chat").withSockJS();
    


我的控制器:

@Controller
public class MessageController 

    @MessageMapping("/hello")
    @SendTo("/topic/chatting")
    public Message messageHandler(Name name) throws Exception
        return new Message("Hello, " + name.getName() + " !");
    


消息类:

public class Message 
    private String content;

    public String getContent() 
        return content;
    

    public void setContent(String content) 
        this.content = content;
    

    public Message(String content) 
        this.content = content;
    

    public Message() 

    


名称和类:

package com.example.webSocketChat.Messages;

public class Name 
    private String name;

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public Name(String name) 
        this.name = name;
    

    public Name() 

    



实际上是html页面本身,它位于resource/static,虽然由于某种原因没有静态文件夹,虽然我通过Spring Initializr创建了项目:

<!DOCTYPE html>
<html>
<head>
    <title>Hello WebSocket</title>
    <script src="sockjs-0.3.4.js"></script>
    <script src="stomp.js"></script>
    <script type="text/javascript">
        var stompClient = null;

        function setConnected(connected) 
            document.getElementById('connect').disabled = connected;
            document.getElementById('disconnect').disabled = !connected;
            document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
            document.getElementById('response').innerHTML = '';
        

        function connect() 
            var socket = new SockJS('/chat');
            stompClient = Stomp.over(socket);
            stompClient.connect(, function(frame) 
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/chatting', function(message)
                    showGreeting(JSON.parse(message.body).content);
                );
            );
        

        function disconnect() 
            stompClient.disconnect();
            setConnected(false);
            console.log("Disconnected");
        

        function sendName() 
            var name = document.getElementById('name').value;
            stompClient.send("/app/hello", , JSON.stringify( 'name': name ));
        

        function showGreeting(message) 
            var response = document.getElementById('response');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.appendChild(document.createTextNode(message));
            response.appendChild(p);
        
    </script>
</head>
<body>
<noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websocket relies on Javascript being enabled. Please enable
    Javascript and reload this page!</h2></noscript>
<div>
    <div>
        <button id="connect" onclick="connect();">Connect</button>
        <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
    </div>
    <div id="conversationDiv">
        <label>What is your name?</label><input type="text" id="name" />
        <button id="sendName" onclick="sendName();">Send</button>
        <p id="response"></p>
    </div>
</div>
</body>
</html>

它似乎已经按照指南正确地完成了所有操作并弄清楚了发生了什么,但是如果你在启动时访问地址 http://localhost:8080 它会引发 404 错误但是如果你去地址 http://localhost:8080/chat 将是消息 Welcome to SockJS!

这可能是什么错误?我没有注意到,我按照 2 个指南做了所有事情,并且代码完全相同。我很乐意提供帮助

【问题讨论】:

在 github 上分享你的代码。 @AnishB。 github.com/ShanksRed/webSocketChat 好的,让我检查一下。 我得到 404。现在,要求是什么 @AnishB。好吧,理论上,你应该得到一个包含名称输入和按钮的页面 【参考方案1】:

好的,你能澄清一下这个问题吗? 这就是为什么页面在根 url 显示 404 错误但 /chat 路由有效的原因吗?

如果您在询问上述问题,请检查 HTML 文件,在connect() 下,您在“/chat”路径打开套接字。 同样在您的 Java 代码中,端点位于 /chat 下,因此会触发 SockJS 连接。根 url 没有任何作用。

【讨论】:

以上是关于为啥spring websocket应用看不到html并抛出404错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥应用程序看不到 Spring Security 中的角色(禁止)

为啥这个 Spring Boot 应用程序找不到主页?

为啥火币服务器收不到 C# WebSocket Ping?

好大一波,波波都大#spring boot websocket单聊+群聊#

ht for web 怎么购买

Spring websocket 线程模型