WebFlux和WebSockets类型=错误的请求,状态= 400

时间:2019-03-14 17:15:02

标签: spring-boot spring-webflux spring-websocket

代码 DemoApplication

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public EchoHandler echoHandler() {
        return new EchoHandler();
    }

    @Bean
    public HandlerMapping handlerMapping() {
        Map<String, WebSocketHandler> map = new HashMap<>();
        map.put("/echo", echoHandler());
        var mapping = new SimpleUrlHandlerMapping();
        mapping.setUrlMap(map);
        mapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return mapping;
    }

    @Bean
    public WebSocketHandlerAdapter handlerAdapter() {
        return new WebSocketHandlerAdapter(webSocketService());
    }

    @Bean
    public WebSocketService webSocketService() {
        var strategy = new ReactorNettyRequestUpgradeStrategy();
        return new HandshakeWebSocketService(strategy);
    }
}

EchoHandler

public class EchoHandler implements WebSocketHandler {
    @Override
    public Mono<Void> handle(WebSocketSession session) {
        return session
                .send(session.receive().map(msg -> "RECEIVED: " + msg.getPayloadAsText()).map(session::textMessage));
    }
}

app.js

var ws = null;
var url = "ws://localhost:8080/echo";
function setConnected(connected) {
    document.getElementById('connect').disabled = connected;
    document.getElementById('disconnect').disabled = !connected;
    document.getElementById('echo').disabled = !connected;
}
function connect() {
    ws = new WebSocket(url);
    ws.onopen = function() {
        setConnected(true);
    };
    ws.onmessage = function(event) {
        log(event.data);
    };
    ws.onclose = function(event) {
        setConnected(false);
        log('Info: Closing Connection.');
    };
}
function disconnect() {
    if (ws != null) {
        ws.close();
        ws = null;
    }
    setConnected(false);
}
function echo() {
    if (ws != null) {
        var message = document.getElementById('message').value;
        log('Sent: ' + message);
        ws.send(message);
    } else {
        alert('connection not established, please connect.');
    }
}
function log(message) {
    var console = document.getElementById('logging');
    var p = document.createElement('p');
    p.appendChild(document.createTextNode(message));
    console.appendChild(p);
    while (console.childNodes.length > 12) {
        console.removeChild(console.firstChild);
    }
    console.scrollTop = console.scrollHeight;
}

index.html

<body>
    <div>
        <div id="connect-container" class="ui centered grid">
            <div class="row">
                <button id="connect" onclick="connect();" class="ui green
button ">Connect</button>
                <button id="disconnect" disabled="disabled" onclick="disconnect();"
                    class="ui red button">Disconnect</button>
            </div>
            <div class="row">
                <textarea id="message" style="width: 350px" class="ui input"
                    placeholder="Message to Echo"></textarea>
            </div>
            <div class="row">
                <button id="echo" onclick="echo();" disabled="disabled"
                    class="ui button">Echo message</button>
            </div>
        </div>
        <div id="console-container">
            <h3>Logging</h3>
            <div id="logging"></div>
        </div>
    </div>
</body>

网页

2019年3月15日星期五15:32:51

发生意外错误(类型=错误请求,状态= 400)。

无效的'Upgrade'标头:[主机:“ localhost:8080”,连接:“保持活动”,用途:“预取”,升级-不安全请求:“ 1”,用户代理:“ Mozilla / 5.0 (Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 72.0.3626.119 Safari / 537.36“,接受:” text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp,image / apng, / ; q = 0.8“,Accept-Encoding:” gzip,deflate,br“,Accept-Language:”“]

我研究弹簧靴,但是webflux和websockets的实践无法正常工作。我不为什么?我访问localhost:8080 / echo,网页显示400。您能告诉我我应该怎么做吗?谢谢。

0 个答案:

没有答案