当前位置: 首页 > 知识库问答 >
问题:

Spring Boot、javascript和web套接字的CORS错误

唐伟
2023-03-14

我尝试了我在互联网上找到的每一个解决方案,现在我只是卡住了

这是我的Spring boot App_控制器:

@RestController
@CrossOrigin(origins = "*")
public class App_Controller {

    int id = 0;
    ArrayList<Player> players = new ArrayList<Player>();
    public void addTab(Player p){
       players.add(p);
    }

    @MessageMapping("/batch-socket")
    @SendTo("/topic/messages")
    public String send(String message) throws Exception {
        String time = new SimpleDateFormat("HH:mm").format(new Date());
        return (message + " : " + time);
    }


    @RequestMapping (value = "/error", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
    public String error(){
        return "erreur";
    }
}

这里是我的corsConfiguration:

@Configuration
public class CorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry){
                registry.addMapping("/**")
                        .allowCredentials(true)
                        .allowedOrigins("*")
                        .allowedHeaders("*")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .maxAge(3600);

            }
        };
    }
}

以下是我的WebSocketConfiguration:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/topic")
                .enableSimpleBroker("/app");
    }

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

最后,这里是我连接此WebSocket的函数:

    function connect(){
        var socket = new SockJS("http://localhost:8080/batch-socket");
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame){
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/messages', function(msgOutput){
                console.log(msgOutput);
            })
        })

    }

我试图添加@CrossOrigin(origins=“*”)和@CrossOrigins(origins=”)http://localhost:63342)我用我的CorsConfig测试了多种可能性。

提前谢谢你的帮助(对不起我的英语)

共有2个答案

蓬化
2023-03-14

我认为,如果是为了一个简单的测试,您不需要创建@bean WebMVCConfiguer corscoonfiguer。您能做一个删除该bean注册的测试并更改注释的顺序吗?

@CrossOrigin(origins = "http://localhost:63342")
@RestController
邢焱
2023-03-14

您没有说明如何加载带有JS的HTML页面。它是同一个localhost:8080还是本地文件
对于测试,您可以告诉Chrome忽略cors限制:

chrome--disable-web-Security--user-data-dir={某些dir}

在您的代码中,您正在执行注册表。addEndpoint()两次,删除一个并将“*”替换为“http://localhost:63342“。删除所有其他与CORS相关的代码。

 类似资料:
  • 问题内容: 当在所有Web浏览器中使用Web套接字时,Ajax是否会过时? 如果我可以使用Web套接字实时获取数据并更新数据,为什么会需要ajax?即使我在应用程序启动时仅使用ajax来获取数据一次,我仍然可能想查看一段时间后该数据是否已更改。 Web套接字是否可以在跨域中使用或仅起源于同一域? 问题答案: WebSockets不会完全淘汰AJAX,而WebSockets可以跨域。 AJAX AJ

  • 我在使用https域和https套接字io时收到此警告。 我的代码是这样的: 希望有答案来解决这个问题。我已经从其他人那里搜索过,但我申请时发现不起作用。

  • Cross-origin resource sharing (CORS)是一种允许来自Web浏览器中其他域的受限资源的机制。 假设,如果你点击html5演示部分中的HTML5- video player 。 它会要求相机许可。 如果用户允许该权限,则只有它会打开相机,否则它不会打开相机用于Web应用程序。 发出CORS请求 这里Chrome,Firefox,Opera和Safari都使用XMLHt

  • 我的应用程序最近收到一个错误 “在'https://my-service-domain/socket.io/?EIO=3 当我连接到 socket.io。我还没有找到这个问题的解决方案,我将详细描述如下图所示,是否有人遇到过此错误。 服务器配置: 客户端配置: 我试图切换webocket连接选项,我得到了错误 "WebSocket连接到'wss://my-service-field/socket.

  • 为了尽可能地理解TCP套接字和websocket之间的区别,我已经在以下问题中找到了很多有用的信息: WebSocket与纯TCP的根本区别 等等 在我的调查中,我浏览了维基百科上的这句话: WebSocket与TCP的不同之处在于它支持消息流而不是字节流 我不完全确定这到底是什么意思。你的解读是什么?

  • 开始使用akka-streams,我想构建一个简单的示例。在chrome中,使用web套接字插件,我可以通过并发送2个命令,简单地连接到这样的流https://blockchain.info/api/apiwebsocket 将在chromes web socket插件窗口中传输结果。 我试图在akka流中实现相同的功能,但面临一些问题: 执行了2个命令,但我实际上没有获得流输出 同一命令执行两次