Web.Config中配置字符串含引号的处理

配置文件常需使用特殊字符,Web.Config默认编码为UTF - 8,对于XML文件,需用实体转义码替换特殊字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置文件中往往要用到一些特殊的字符,

Web.Config默认编码格式为UTF-8,对于XML文件,要用到实体转义码来替换。对应关系如下:

字符转义码
& 符号&&
单引号''
双引号""
大于>>
小于<&lt;
 
这是服务A: package com.example.demo.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic", "/queue"); // 保留基础配置 config.setApplicationDestinationPrefixes("/app"); // 移除 setUserDestinationPrefix 配置 } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws-gateway") .setAllowedOriginPatterns("*") .withSockJS(); } } package com.example.demo.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.messaging.simp.stomp.StompCommand; import org.springframework.messaging.simp.stomp.StompFrameHandler; import org.springframework.messaging.simp.stomp.StompHeaders; import org.springframework.messaging.simp.stomp.StompSession; import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter; import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler; import org.springframework.stereotype.Service; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.messaging.WebSocketStompClient; import org.springframework.web.socket.sockjs.client.SockJsClient; import org.springframework.web.socket.sockjs.client.Transport; import org.springframework.web.socket.sockjs.client.WebSocketTransport; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @Service public class StompClientSender { @Autowired private SimpMessagingTemplate messagingTemplate; private final Map<String, StompSession> clientSessions = new ConcurrentHashMap<>(); private String userId; public void sendCommand(String command, String targetClient, String userId) { try { String sessionKey = targetClient + "#" + userId; StompSession session = clientSessions.computeIfAbsent(sessionKey, k -> connectToClient(targetClient,userId)); Map<String, String> requestMap = new HashMap<>(); requestMap.put("command", command); requestMap.put("host", targetClient); requestMap.put("userId", userId); this.userId = userId; session.send("/app/executeCommand", requestMap); } catch (Exception e) { throw new RuntimeException("命令发送失败", e); } } private StompSession connectToClient(String clientAddress, String userId) { List<Transport> transports = new ArrayList<>(); transports.add(new WebSocketTransport(new StandardWebSocketClient())); WebSocketStompClient stompClient = new WebSocketStompClient(new SockJsClient(transports)); stompClient.setMessageConverter(new MappingJackson2MessageConverter()); stompClient.setTaskScheduler(new ConcurrentTaskScheduler()); CompletableFuture<StompSession> future = new CompletableFuture<>(); stompClient.connect("http://" + clientAddress + ":7788/ws-client", new StompSessionHandlerAdapter() { @Override public void afterConnected(StompSession session, StompHeaders headers) { // 关键修改:订阅用户专属主题 String userTopic = "/topic/commandOutput/" + userId; session.subscribe(userTopic, new StompFrameHandler() { @Override public Type getPayloadType(StompHeaders headers) { return String.class; } @Override public void handleFrame(StompHeaders headers, Object payload) { String output = (String) payload; System.out.println("收到响应: " + output + ",转发至用户: " + userId); // 直接通过公共主题转发响应 messagingTemplate.convertAndSend( "/topic/bToCommandOutput/" + userId, output ); } }); future.complete(session); } @Override public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) { future.completeExceptionally(exception); } }); try { // 使用get()方法并设置超时 return future.get(5, TimeUnit.SECONDS); } catch (Exception e) { throw new RuntimeException("连接小客户端超时", e); } } } public void toExecuteCommand(Map<String, String> payload) { String host = payload.get(“host”); String command = payload.get(“command”); String userId = payload.get(“userId”); StompClientSender sender = new StompClientSender(); sender.sendCommand(command, host, userId); // // 关键修改:直接发送到用户专属主题 // String userTopic = “/topic/bToCommandOutput/” + payload.get(“userId”); // messagingTemplate.convertAndSend( // userTopic, // “xxxxxxxxxxxxxxxxxxxx” // ); }这是服务B:package com.example.demo.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class ClientWebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic", "/queue"); // 保持基础配置 config.setApplicationDestinationPrefixes("/app"); // 移除 setUserDestinationPrefix 配置 } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws-client") .setAllowedOriginPatterns("*") .withSockJS(); } } @MessageMapping(“/executeCommand”) public void executeCommand(@RequestParam Map<String, String> payload) { // 执行命令逻辑… // 关键修改:直接发送到用户专属主题 String userTopic = "/topic/commandOutput/" + payload.get("userId"); messagingTemplate.convertAndSend( userTopic, "outputoutputoutputoutput" ); }为什么A和B连接成功了,A可以发送消息给B,但是A无法接收到B的消息,String userTopic = "/topic/commandOutput/" + payload.get("userId"); messagingTemplate.convertAndSend( userTopic, "outputoutputoutputoutput" );的消息A接收不到?
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值