Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Spring WebSocket与SockJS连接到另一个域_Spring_Websocket_Http Status Code 403_Sockjs - Fatal编程技术网

Spring WebSocket与SockJS连接到另一个域

Spring WebSocket与SockJS连接到另一个域,spring,websocket,http-status-code-403,sockjs,Spring,Websocket,Http Status Code 403,Sockjs,春天的WebSocket是一个相当新的话题;我很想再多找一点 我的问题是从不同的域连接到一个服务,我正在与Lineman一起构建前端和Spring Boot,而在后端,我在两个不同的端口上使用这些应用程序:localhost上的8000和8080 我对“Access Control Allow Origin”头有问题,但我已通过在服务器端添加一个过滤器解决了问题,该过滤器将允许的源添加到头中。在此之后,我开始在连接时出现以下错误: GET http://localhost:8080/socket

春天的WebSocket是一个相当新的话题;我很想再多找一点

我的问题是从不同的域连接到一个服务,我正在与Lineman一起构建前端和Spring Boot,而在后端,我在两个不同的端口上使用这些应用程序:localhost上的8000和8080

我对“Access Control Allow Origin”头有问题,但我已通过在服务器端添加一个过滤器解决了问题,该过滤器将允许的源添加到头中。在此之后,我开始在连接时出现以下错误:

GET http://localhost:8080/socket/info 403 (Forbidden)
AbstractXHRObject._start @ sockjs-0.3.4.js:807
(anonymous function) @sockjs-0.3.4.js:841
我在项目中没有Spring安全性,因此这不是授权问题,错误指向sockJS: that.xhr.send(有效载荷);-其中负载从未定义。我尝试过,但找不到调用的根,该调用从何处开始

我在想,在设置连接时是否需要在SockJS和Stomp中添加一些额外的信息,但该工具的两个wiki页面中都没有太多的示例和注释

下面您将找到连接JS代码

var socket = new SockJS("http://localhost:8080/socket");
client = Stomp.over(socket);

client.connect({'login': BoatsGame.userName,
                    'passcode': 'guest'},
            function (frame) {
....

The Server Side has a MessageBroker configured :    


@Configuration
@EnableWebSocketMessageBroker
public class MessageBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
     ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
     container.setMaxTextMessageBufferSize(8192);
     container.setMaxBinaryMessageBufferSize(8192);
     return container;
}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
     //config.enableStompBrokerRelay("/queue", "/topic");
     config.enableSimpleBroker("/queue", "/topic","/user");
     config.setApplicationDestinationPrefixes("/BoatBattleGame");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
    stompEndpointRegistry.addEndpoint("/socket").withSockJS();
}
}
我还尝试设置MessageHandler,因为它可以在配置时设置OriginAllowe,但我不确定它是如何连接到代理的

最后,当在一个端口上运行时,此设置可以正常工作

Jax的anwesr是正确的:)

registerStompEndpoints方法为我们提供了设置允许的原点的机会。 我们需要将其添加到“withSockJs()”选项之前


对于试图通过SockJsClient连接到其他域时因403禁止回答而获得此票证的任何人:

作为握手的一部分,尝试访问/info Url时会出现问题。响应实际上通过WGET和浏览器返回200。只有通过SockJsClient,它才不起作用

在尝试了不同的解决方案之后,唯一真正解决这个问题的方法是编写一个实现Transport和InfoReceiver的类。通过这种方式,开发人员可以直接处理握手的这一部分。 基本上是在executeInfo()方法中完成工作:

@覆盖
公共字符串ExecuteInfo请求(URI infoUrl、HttpHeaders){
HttpGet getRequest=newhttpget(infoUrl);//最终在此处添加头
HttpClient=HttpClients.createDefault();
试一试{
HttpResponse response=client.execute(getRequest);
List responseOutput=IOUtils.readLines(response.getEntity().getContent());
返回responseOutput.get(0);
}捕获(ioe异常ioe){
...
}
}

我将TransportType.XHR定义为传输类型。

我通过创建一个过滤器找到了这个解决方案

package com.diool.notif.config;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class SimpleCORSFilter implements Filter {

    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(SimpleCORSFilter.class);
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        LOGGER.info("Initilisation du Middleware");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest requestToUse = (HttpServletRequest)servletRequest;
        HttpServletResponse responseToUse = (HttpServletResponse)servletResponse;

        responseToUse.setHeader("Access-Control-Allow-Origin",requestToUse.getHeader("Origin"));
        filterChain.doFilter(requestToUse,responseToUse);
    }

    @Override
    public void destroy() {

    }
}

在我的例子中,我必须添加这些配置才能让SockJS/STOM与CORS一起工作:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer
{
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(false)
                .maxAge(3600)
                .allowedHeaders("Accept", "Content-Type", "Origin", 
"Authorization", "X-Auth-Token")
                .exposedHeaders("X-Auth-Token", "Authorization")
                .allowedMethods("POST", "GET", "DELETE", "PUT", "OPTIONS");
    }
}

你把它放在哪里了?你必须做更多的修改,但是添加这个类?我把它放在我的软件包的“config”文件夹中。除了sockjs,这个连接也来自移动客户端吗?谢谢!它为我指明了正确的方向,我在申请表中遗漏了这一部分:-)
package com.diool.notif.config;

import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class SimpleCORSFilter implements Filter {

    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(SimpleCORSFilter.class);
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        LOGGER.info("Initilisation du Middleware");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest requestToUse = (HttpServletRequest)servletRequest;
        HttpServletResponse responseToUse = (HttpServletResponse)servletResponse;

        responseToUse.setHeader("Access-Control-Allow-Origin",requestToUse.getHeader("Origin"));
        filterChain.doFilter(requestToUse,responseToUse);
    }

    @Override
    public void destroy() {

    }
}
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer
{
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(false)
                .maxAge(3600)
                .allowedHeaders("Accept", "Content-Type", "Origin", 
"Authorization", "X-Auth-Token")
                .exposedHeaders("X-Auth-Token", "Authorization")
                .allowedMethods("POST", "GET", "DELETE", "PUT", "OPTIONS");
    }
}