当我尝试通过STOMP Java FX客户端发送auth标头时,它们不会被传递到Spring Boot后端。
客户端:
String URL = 'wss://myurl.de/wsconnection'
WebSocketClient client = new StandartWebSocketClient(client);
WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
StompSessionHandler sessionHandler = new MyStompSessionHandler();
StompHeaders headers = new Headers();
headers.set("Authorization", "Bearer myToken")
headers.setLogin("Bearer myToken")
stompClient.connect(URL, sessionHandler,headers);
我尝试了两种方法:使用登录标头方法和定制的授权标头。所以在后端,我尝试通过这两个头中的一个获取JWT。不幸的是,JWT值始终为空,因此没有传递。
后端:
@Configuration
public class WebSocketSecurityConf extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages.anyMessage().permitAll();
}
@Override
protected boolean sameOriginDisabled() {
return true;
}
}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(new ChannelInterceptorAdapter() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
if (StompCommand.CONNECT.equals(accessor.getCommand())) {
String jwtToken;
jwtToken = accessor.getFirstNativeHeader("Authorization");
if(jwtToken == null){
jwtToken = accessor.getFirstNativeHeader("login");
}
System.out.println("webSocket token is "+ jwtToken);
System.out.println("accessor header "+ accessor.getMessageHeaders());
有什么好主意吗?
1条答案
按热度按时间vlf7wbxs1#
您混淆了这里参数的顺序:“
stompClient.connect(URL, sessionHandler,headers);
”头应该在处理程序之前。以下是来自Spring的来源:
public ListenableFuture<StompSession> connect(String url, @Nullable WebSocketHttpHeaders handshakeHeaders, @Nullable StompHeaders connectHeaders, StompSessionHandler handler, Object... uriVariables)