WebSockets en Primavera es un lugar nuevo tema que yo;m agotador para encontrar un poco más.

Mi problema es con la conexión a un servicio desde un dominio diferente, en el que estoy trabajando con el Liniero la construcción del front-end lado y la Primavera de Arranque cuando se hace el back-end de lado, con eso tengo estas aplicaciones en dos puertos diferentes : 8000 y 8080 en localhost.

De que tenía problemas con el ‘Access-Control-Allow-Origin’ encabezado, pero me han resuelto mediante la adición de un filtro en el lado del servidor, la cual agregó que el permitido origen a la cabecera. Después de esto empecé a recibir el siguiente error en la conexión:

GET http://localhost:8080/socket/info 403 (Forbidden)
AbstractXHRObject._start @ sockjs-0.3.4.js:807
(anonymous function) @sockjs-0.3.4.js:841

No tengo la Primavera de de Seguridad en el proyecto, así que esto no es una autorización problema, el error de los puntos a sockJS :
que.xhr.enviar(capacidad de carga); – en caso de carga nunca se define.Lo intenté, pero no podía encontrar la raíz de la convocatoria donde se puede empezó.

Yo estaba pensando si tengo que agregar alguna información adicional a SockJS y Pisotear al establecer la conexión, pero no hay mucho de ejemplos y notas tanto en las páginas de la wiki de este tipo de herramientas.

A continuación encontrará la conexión de código 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();
}
}

También probé la configuración de una MessageHandler ya que tiene la opción de configurar OriginAllowe a la hora de configurar, pero no estoy seguro de cómo está conectado con el corredor.

Última pensar, esta configuración funciona correctamente cuando se ejecuta en un puerto.

OriginalEl autor Sniady | 2015-05-28

4 Comentarios

  1. 50

    De Jax anwesr estaba en lo correcto 🙂

    La registerStompEndpoints método nos da la oportunidad de establecer un Permitió a los Orígenes.
    Tenemos que añadir que antes de la «withSockJs()» opción.

        @Override
        public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
            stompEndpointRegistry.addEndpoint("/BO/socket").setAllowedOrigins("*").withSockJS();
        }
    ¿Esto también conexión de clientes móviles aparte de sockjs?

    OriginalEl autor Sniady

  2. 6

    A nadie entrar a esta entrada debido a la 403 Prohibido respuesta cuando se trata de conectar a través de un SockJsClient a un dominio diferente:

    El problema surge cuando se intenta hacer un GET a la /info Url, como parte de la negociación. La respuesta en realidad devuelve un 200 través de WGET así como a través de un navegador. Sólo a través de SockJsClient no funciona.

    Después de probar diferentes soluciones, la única que realmente se haya corregido el problema es escribir una clase que implementa el Transporte y InfoReceiver. De esta manera, el desarrollador puede manejar directamente esta parte de la apretón de manos.
    Básicamente, usted hacer el trabajo en el executeInfoRequest() método:

    @Override
    public String executeInfoRequest(URI infoUrl, HttpHeaders headers) {
        HttpGet getRequest = new HttpGet(infoUrl); //eventually add headers here
        HttpClient client = HttpClients.createDefault();
    
        try {
            HttpResponse response = client.execute(getRequest);
            List<String> responseOutput = IOUtils.readLines(response.getEntity().getContent());
    
            return responseOutput.get(0);
        } catch (IOException ioe) {
            ...
        }
    }

    He definido TransportType.XHR como tipo de transporte.

    ¿De dónde colocar este código?

    OriginalEl autor Mauro

  3. 2

    En mi caso, he tenido que añadir estos configuarations para obtener SockJS /STOM para trabajar con 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");
        }
    }

    OriginalEl autor Frithjof Schaefer

  4. 1

    he encontrado esta solución mediante la creación de un Filtro de

    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() {
    
        }
    }
    donde u hizo lugar? Había que hacer más cambios, pero la incorporación de esta clase?
    me lo puso dentro de la «config» en la carpeta de mi paquete

    OriginalEl autor Fabricelepro

Dejar respuesta

Please enter your comment!
Please enter your name here