Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WebSocket握手期间出错(意外响应代码:400)_Java_Spring_Websocket_Apache2.4_Sockjs - Fatal编程技术网

Java WebSocket握手期间出错(意外响应代码:400)

Java WebSocket握手期间出错(意外响应代码:400),java,spring,websocket,apache2.4,sockjs,Java,Spring,Websocket,Apache2.4,Sockjs,我的代码在localhost中运行良好,但当我将应用程序置于服务器时,就会发生此错误 WebSocket连接到 'wss://url.com/webSocket/193/uj4s3xue/websocket'失败:执行过程中出错 WebSocket握手:意外响应代码:400 sockjs.min.js:2个帖子 403(禁止) Js代码: function connect() { var socket = new SockJS('/webSocket');

我的代码在localhost中运行良好,但当我将应用程序置于服务器时,就会发生此错误

WebSocket连接到 'wss://url.com/webSocket/193/uj4s3xue/websocket'失败:执行过程中出错 WebSocket握手:意外响应代码:400

sockjs.min.js:2个帖子 403(禁止)

Js代码:

   function connect() {
        var socket = new SockJS('/webSocket');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            stompClient.debug = null;
            stompClient.subscribe('/topic/messages/' + vm.id, function (greeting) {
                refreshMessages(JSON.parse(greeting.body));
            });
        });
    } 
Java代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/webSocket").setAllowedOrigins("*").withSockJS();
    }

    @Bean
    public PresenceChannelInterceptor presenceChannelInterceptor() {
        return new PresenceChannelInterceptor();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(presenceChannelInterceptor());
    }

    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {
        registration.taskExecutor().corePoolSize(8);
        registration.setInterceptors(presenceChannelInterceptor());
    }
}
在spring服务器中,发生以下异常:

2017-05-27 11:14:57.101错误51230---[XNIO-2任务-11] o、 s.w.s.s.s.DefaultHandshakeHandler:由于以下原因,握手失败 无效的升级头:null

2017-05-27 11:16:10.020错误51230---[MessageBroker-1] o、 s.s.s.TaskUtils$LoggingErrorHandler:发生意外错误 在计划任务中

org.springframework.web.socket.sockjs.SockJsTransportFailureException: 无法写入SockJsFrame content='h';嵌套异常是 java.io.IOException:在 org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.writeFrame(AbstractSockJsSession.java:339) 在 org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.sendHeartbeat(AbstractSockJsSession.java:255) 在 org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession$HeartbeatTask.run(AbstractSockJsSession.java:451) 在 org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) 在 Executors$RunnableAdapter.call(Executors.java:511) 在java.util.concurrent.FutureTask.run(FutureTask.java:266)处 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:748)处,由以下原因引起: java.io.IOException:在 sun.nio.ch.FileDispatcherImpl.writev0(本机方法)位于 sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:51)位于 write(IOUtil.java:148)位于 sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:504)位于 org.xnio.nio.niosocketconductor.write(niosocketconductor.java:161)位于 io.undertow.server.protocol.http.HttpResponseConduit.write(HttpResponseConduit.java:645) 在 io.undertow.conductions.chunkedstreamsinkconductor.doWrite(chunkedstreamsinkconductor.java:163) 在 io.undertow.conductors.chunkedstreamsinkconductor.write(chunkedstreamsinkconductor.java:127) 在 org.xnio.conductions.ConduitStreamSinkChannel.write(ConduitStreamSinkChannel.java:150) 在 io.undertow.channels.detaccableStreamSinkChannel.write(detaccableStreamSinkChannel.java:240) 在 io.undertow.server.HttpServerExchange$WriteDispatchChannel.write(HttpServerExchange.java:2049) 在 io.undertow.servlet.spec.ServletOutputStreamImpl.writeBufferBlocking(ServletOutputStreamImpl.java:570) 在 io.undertow.servlet.spec.ServletOutputStreamImpl.flushInternal(ServletOutputStreamImpl.java:485) 在 io.undertow.servlet.spec.ServletOutputStreamImpl.flush(ServletOutputStreamImpl.java:472) 在 io.undertow.servlet.spec.HttpServletResponseImpl.flushBuffer(HttpServletResponseImpl.java:461) 在 servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:215) 在 servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:215) 在 org.springframework.security.web.util.OnCommittedResponseWrapper.flushBuffer(OnCommittedResponseWrapper.java:159) 在 servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:215) 在 org.springframework.http.server.ServletServerHttpResponse.flush(ServletServerHttpResponse.java:96) 在 org.springframework.web.socket.sockjs.transport.session.AbstractHttpSockJsSession.writeFrameInternal(AbstractHttpSockJsSession.java:350) 在 org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.writeFrame(AbstractSockJsSession.java:322) ... 省略10个公共框架


服务器是apache2 web服务器。如何解决此问题?

我通过使用激活ws_tunnel来解决此问题

sudo a2enmod代理隧道

并在位于

/etc/apache2/sites enabled/000-default-le-ssl.conf


这对我来说是可行的,只需要将ws://更改为wss://因为我正在连接到https协议。
  RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /webSocket(.*)           ws://127.0.0.1:8080/webSocket/$1 [P,L]