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

Spring WebSocket返回未记录的403

通飞尘
2023-03-14

我的Spring WebSocket返回了一个403,虽然我不确定为什么Spring Security当前不在类路径上。

注意:我开始写这个问题,然后打开full Spring Boot debug,下面是它发出的最后3行日志。

2015-08-23 14:38:30.263 DEBUG 32271 --- [nio-8080-exec-1] o.s.b.a.e.mvc.EndpointHandlerMapping     : Looking up handler method for path /socket/info
2015-08-23 14:38:30.270 DEBUG 32271 --- [nio-8080-exec-1] o.s.b.a.e.mvc.EndpointHandlerMapping     : Did not find handler method for [/socket/info]
2015-08-23 14:39:08.791  INFO 32271 --- [eBrokerSockJS-1] o.s.w.s.c.WebSocketMessageBrokerStats    : WebSocketSession[0 current WS(0)-HttpStream(0)-HttpPoll(0), 0 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(0)-CONNECTED(0)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], outboundChannelpool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]
HTTP/1.1 403 Forbidden
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-: POST, GET, PUT, OPTIONS, DELETE
Access-Control-Allow-Headers: content-type, x-auth-token, x-requested-with
Access-Control-Expose-Headers: Location
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 3600
X-Application-Context: application
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Content-Length: 0
Date: Sun, 23 Aug 2015 18:01:10 GMT
GET /socket/info?t=1440352870279 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
Accept: */*
DNT: 1
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: NXSESSIONID=174bf31b-e199-44e3-bae8-f5f44ad6ee90
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

@Override
public void registerStompEndpoints( final StompEndpointRegistry registry ) {
    registry.addEndpoint( "/socket" ).withSockJS();
}

}
var SockJS = require( 'sockjs-client' );
var sock = new SockJS( 'http://localhost:8080/socket' );
var Stomp = require( 'stompjs' );
var stompClient = Stomp.over( sock );
stompClient.connect( {}, function( frame ) {
    console.log( 'Connected: ' + frame );
    stompClient.subscribe( '/topic/stations/create', function() {
        console.log( 'subscribed' );
    } );
} );

共有1个答案

祁和通
2023-03-14

显然还有第二个允许源,我需要允许,特别是对于WebSockets。在我的应用程序.properties中有一个Alloworigin,然后在我的配置上使用了setter注入,因为构造函数注入在这个bean类型上不起作用。然后,在调用withsockjs之前,我只需添加setAllowedOrigins(...)

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

private URI allowOrigin;

@Inject // constructor injection not working in this class, use setter injection instead
public void setAllowOrigin(  @Value( "${allowOrigin}" ) final URI allowOrigin ) {
    this.allowOrigin = Objects.requireNonNull( allowOrigin );
}

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

@Override
public void registerStompEndpoints( final StompEndpointRegistry registry ) {
    registry.addEndpoint( "/socket" )
            .setAllowedOrigins( allowOrigin.toString() )
            .withSockJS();
}

}
 类似资料:
  • 我有一个spring批处理应用程序,其中读卡器从外部数据库读取数据,处理器将其转换为目标数据库的POJO,写卡器将转换后的POJO写入目标数据库 我正在使用以下CrudRepository 我想知道,上面的ItemReader会是什么样子? 我应该打电话给MyCrudepository吗。在my ItemReader的中查找(String from,String to)? 这不会使ItemRead

  • 在MariaDB数据库中,使用语句和子句从表中检索一个或多个记录。 语法: 示例1: 以降序检索记录: 使用语句并带有子句查询表中的数据。结果列的值按降序显示,为。参考如下语句 - 执行上面查询语句,得到以下结果 - 示例2: 按列的值升序检索记录: 执行上面查询语句,得到以下结果 - 示例3:分页 在应用程序中,由于数据记录太多,不能全在一个页面中全部显示,我们经常要使用分页来显示。假设每页显示

  • 问题内容: 我在Elasticsearch中有一个小型数据库,出于测试目的,我想拉回所有记录。我正在尝试使用以下形式的网址… 有人可以给我您用来完成此操作的URL吗? 问题答案: 我认为支持lucene语法是这样的: 大小默认为10,因此您可能还需要获取10个以上的商品。(其中BIGNUMBER等于您认为大于数据集的数字) 但是,elasticsearch文档建议使用扫描搜索类型针对大型结果集。

  • 问题内容: 我想从ElasticSearch索引返回最近的记录(前1个),类似于下面的sql查询; 能做到吗? 问题答案: 你有_timestamp在您的文档映射启用? 您可以在此处检查映射: 如果是这样,我认为这可能会获得最新的信息:

  • 问题内容: 我有一个元组,有100个姓氏。我如何在sqlite3中执行以下操作: 这样我就可以返回中包含的姓氏的所有记录。 问题答案: 问题 :返回所有记录中包含的姓氏 核心是创建一个查询,该查询具有与序列中一样多的绑定。 在需要排除最后一个逗号。 SQLite理解的SQL-子句 bindings = ‘?,’*len(surnames) QUERY = “select firstname, su

  • 问题内容: 我正在尝试使查询工作从表单控件获取值(有时只是字符串的第一部分)。我的问题是,仅在键入完整字符串时它才返回记录。 即在姓氏框中,我应该能够键入gr,它会弹出 绿灰色格雷厄姆 但是目前,除非使用完整的搜索字符串,否则它不会显示任何内容。 所涉及的表单上有4个搜索控件,并且仅当填写该框时才在查询中使用它们。 查询是: 问题答案: 有一种访问方法! 如果您在表单上具有“过滤器”控件,那么为什