Spring boot 工程设置上下文路径时的 Websocket 配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Allen_jinjie/article/details/78728536

项目中用的 Websocket,可以参考 Using WebSocket to build an interactive web application ,我用的是 Maven 构建的工程。教程不难,但是有几个新手需要注意的地方,特别是重构老工程,容易眼花。

第一个就是 Websocket 前后端的纽带配置,也就是继承了 AbstractWebSocketMessageBrokerConfigurer 的实现类:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

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

再就是新建一个 Websocket 具体请求的实现类,他需要有三个注解:@RestController / @MessageMapping / @SendTo 。

 * @RestController : 标记当前的类为 Websocket 请求处理类
 * @MessageMapping 类上的路径 + 方法上的路径 = 前端请求需要的路径
 * @SendTo : 响应放入的消息代理地址,前端实时获取里面的信息

我在改老工程的时候,就是使用的 @RequestMapping 而不是 @MessageMapping,导致老是连不通。

由于我们使用 SpringBoot 构建的工程,我们在 application.properties 里面设置了项目名称,也就是上下文路径:

# 当前应用在部署后的应用名
server.contextPath=/edc

这样,前端在做 websocket 连接时,路径就需要带上这个应用名。

function connect() {
	var socket = new SockJS('/edc/websocket'); //1
	stompClient = Stomp.over(socket);//2
	stompClient.connect({}, function(frame) {//3
		stompClient.subscribe('/topic/resultMsg', function(respnose){ //4
			console.log("connnnnnnnected!!!!!!!!!!!!")
		});
	});
}
后端 websocket 实现类如下:

@RestController
@RequestMapping("topic")
@MessageMapping("topic")
@Api("问卷题目的操作")
public class TopicsController {
	private Logger logger = LoggerFactory.getLogger(TopicsController.class);
		
	@Autowired
	private TopicService topicService;    

	@ApiOperation(value="删除题目")
	@RequestMapping(value="deletion",method=RequestMethod.POST)
	@MessageMapping("deletion")
	@SendTo("/topic/resultMsg")
    public BaseResponse<String> deleteTopic(Topic topic) throws Exception {
		logger.debug("进入删除题目  deleteTopic()");	
    	BaseResponse resp = new BaseResponse<>(RESPONSE_STATUS.SUCCESS);
    	topicService.deleteTopic(topic);
    	resp.setMsg(EdcConstants.WEBSOCKET_SUCCESS);
    	return resp;
    }    
}

可以看到,整个处理类的删除题目的 @MessageMapping 路径就是 "/topic/deletion" ,这个就是前端在发删除题目的 Websocket 请求时的路径:

function sendName() {
	stompClient.send("/topic/deletion", {}, JSON.stringify({ 'id': 9, 'surveyId': 1 }));//5
}

假如我们在 WebSocketMessageBroker 设置了 setApplicationDestinationPrefixes() 并且值为 “edc”, 则前端的删除题目请求路径为:

function sendName() {
	stompClient.send("/edc/topic/deletion", {}, JSON.stringify({ 'id': 9, 'surveyId': 1 }));//5
}

而 Controller 类里面的 @MessageMapping 不用做任何修改。


猜你喜欢

转载自blog.csdn.net/Allen_jinjie/article/details/78728536