Spring WebSocket Connecting with SockJS to a different domain

前端 未结 4 1303
有刺的猬
有刺的猬 2021-02-02 09:30

WebSockets in Spring is a rather new topic that I;m tiring to find a bit more.

My problem is with connecting to a service from a different domain, I\'m working on with

相关标签:
4条回答
  • 2021-02-02 09:39

    Jax's anwesr was correct :)

    The registerStompEndpoints method gives us the opportunity to set the Allowed Origins. We need to add it before the "withSockJs()" option.

        @Override
        public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
            stompEndpointRegistry.addEndpoint("/BO/socket").setAllowedOrigins("*").withSockJS();
        }
    
    0 讨论(0)
  • 2021-02-02 09:42

    To anyone getting to this ticket because of the 403 Forbidden answer when trying to connect through a SockJsClient to a different domain:

    The problem arises when trying to make a GET to the /info Url, as part of the handshaking. The response actually returns a 200 via WGET as well as via browser. Only through SockJsClient it doesn't work.

    After trying different solutions, the only one that really fixed the issue is to write a class that implements Transport and InfoReceiver. In this way the developer can directly handle this part of the handshake. Basically you make the work in the executeInfoRequest() method:

    @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) {
            ...
        }
    }
    

    I defined TransportType.XHR as transport type.

    0 讨论(0)
  • 2021-02-02 09:45

    In my case, I had to add these configuarations to get SockJS / STOM to work with 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");
        }
    }
    
    0 讨论(0)
  • 2021-02-02 09:58

    i found this solution by creating a Filter

    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() {
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题