簡體   English   中英

Stomp 不訂閱代理消息

[英]Stomp does not subscribe to broker message

我有應用程序 StompJs 從下面的服務器訂閱消息:

客戶:

this.stompClient = this.createStormClient();
        this.stompClient.connect(this.socket.header, frame => {
            console.log(frame);
            if (this.stompClient) {
              this.stompClient.subscribe(`topic/hello`,(data:any) => {
                console.log('subscribe hello finish.')
                console.log(data);
              });
            }
     });
    
    createStormClient():any {
        let ws = new SockJS('http://127.0.0.1:8084/api/websocket');
        let stompClient = Stomp.over(ws);
        return stompClient;
    }

服務器:

@Configuration
public class WebSocketAuthorizationSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
    @Override
    protected void configureInbound(final MessageSecurityMetadataSourceRegistry messages) {
        // You can customize your authorization mapping here.
        messages
        .simpSubscribeDestMatchers("topic/hello").authenticated()
        .anyMessage().authenticated();
    }

    // TODO: For test purpose (and simplicity) i disabled CSRF, but you should re-enable this and provide a CRSF endpoint.
    @Override
    protected boolean sameOriginDisabled() {
        return true;
    }
}

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer, ChannelInterceptor {

    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private JwtUserDetailsService userSerive;

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/api/websocket").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    List<String> authorization = accessor.getNativeHeader("X-Authorization");
                    String accessToken = authorization.get(0);
                    if (accessToken != null && accessToken.startsWith("Bearer ")) {
                        String jwtToken = accessToken.substring(7);
                        String userUrl = jwtTokenUtil.getUsernameFromToken(jwtToken);
                        if (!StringUtil.isEmpty(userUrl)) {
                            UserDetails userDetails = userSerive.loadUserByUsername(userUrl);
                            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                                    userDetails, "", userDetails.getAuthorities());
                            accessor.setUser(authentication);
                        }
                    }
                }
                return message;
            }
        });
    }
}

控制器發送消息

public class Controller {
    @Autowired
    private SimpMessagingTemplate template;
    
    @RequestMapping(value = "/api/hello", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> newBook(@RequestBody Long id) {
        try {
            template.convertAndSend("topic/hello", "hello broker message");
            return new ResponseEntity<Boolean>(true,HttpStatus.OK);
        } catch(Exception ex) {
            log.error("new quick book error" + ex.getMessage());
            return new ResponseEntity<>(HttpStatus.NOT_ACCEPTABLE);
        }
    }
}

控制台顯示框架:

[日志] Frame {command: "CONNECTED", headers: {user-name: "7", heart-beat: "0,0", version: "1.1"}, body: "", toString: function}(標簽-home-home-module.js,第 293 行)

並訂閱:

>>> SUBSCRIBE
id:sub-0
destination:topic/hello

網絡

a["CONNECTED\\nversion:1.1\\nheart-beat:0,0\\nuser-name:7\\n\\n\"]
["訂閱\\nid:sub-0\\ndestination:topic/hello\\n\\n\"]

控制台在訂閱中沒有我的預期

console.log('subscribe hello finish.')
            console.log(data);

它在工作

config.enableSimpleBroker("topic","queue");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM