登录界面/跳出登录界面跳转到“我的”界面需点击刷新(F5),token才生效问题

本文详细描述了在使用封装后的axios进行登录操作时,遇到的token未立即生效,导致信息更新需手动刷新的问题。通过调整代码结构,将全局设置的token移除,并在service中正确处理,最终解决了token不生效及界面信息不刷新的问题。

 错误代码
      
main.js中:


 上面可见,我将axios重新封装了,错误代码应用后出现的问题:每次登录跳转到“我的界面”,需要手动刷新界面,token才会生效,信息才会更新上面可见,我将axios重新封装了,错误代码应用后出现的问题:每次登录跳转到“我的界面”,需要手动刷新界面,token才会生效,信息才会更新

经过长时间试错,修改(曾试过强行刷新界面,三种刷新界面都试过,效果不理想)

今天在拦截器里判断语句中加测试打印语句,发现:整个过程并不执行拦截器代码,经测试后,得到一个结论:之前请求头中加token并不是拦截器起作用,而是最上面的全局设置起到的作用!!!

修改后代码

main.js中:

这里将全局设置注释掉(或者不注释,看是否需要,图片上传需要纯净的axios,不经过service拦截器的话,就需要这句话来加token,是否需要还没测试,暂时是猜测,反正正常service是不需要啦)

这里改成service

终于完美解决登录跳转,token不生效问题、界面信息不刷新!!!
 

package com.tplink.cloud.demo.websocket_client; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.websocket.ContainerProvider; import javax.websocket.WebSocketContainer; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.messaging.converter.ByteArrayMessageConverter; import org.springframework.messaging.converter.CompositeMessageConverter; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.StringMessageConverter; 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.web.client.RestTemplate; import org.springframework.web.socket.WebSocketHttpHeaders; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.messaging.WebSocketStompClient; import org.springframework.web.socket.sockjs.client.RestTemplateXhrTransport; import org.springframework.web.socket.sockjs.client.SockJsClient; import org.springframework.web.socket.sockjs.client.Transport; import org.springframework.web.socket.sockjs.client.WebSocketTransport; /** * Description of this file * * @author Li Tailong * @version 1.0 * @since 2025/11/7 */ // VMS配置类(存储vmsId和对应凭证) class VMSConfigLocal { private final String vmsId; private final String cookie; private final String csrfToken; private final String userId; public VMSConfigLocal(String vmsId, String cookie, String csrfToken, String userId) { this.vmsId = vmsId; this.cookie = cookie; this.csrfToken = csrfToken; this.userId = userId; } public String getVmsId() { return vmsId; } public String getCookie() { return cookie; } public String getCsrfToken() { return csrfToken; } public String getUserId() { return userId; } } // HTTP请求工具类(支持多vmsId) class HttpUtilForLocal { private static final String BASE_URL_TEMPLATE = "https://localhost:8081/api/v2/vms/%s/local/%s/sites/1707841329070081/demosend"; public static void sendDemoRequest(VMSConfigLocal config, String uuid) { try { String baseUrl = String.format(BASE_URL_TEMPLATE, config.getVmsId(), config.getUserId()); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Cookie", config.getCookie()); headers.set("CSRF-TOKEN", config.getCsrfToken()); Map<String, Object> body = new HashMap<>(); body.put("total", 50); body.put("uuid", uuid); HttpEntity<Map<String, Object>> request = new HttpEntity<>(body, headers); ResponseEntity<String> response = restTemplate.exchange( baseUrl, HttpMethod.POST, request, String.class); System.out.printf("HTTP请求 VMSID:%s UUID:%s 状态码:%s%n", config.getVmsId(), uuid, response.getStatusCode()); } catch (Exception e) { System.err.printf("HTTP请求失败 VMSID:%s UUID:%s 错误:%s%n", config.getVmsId(), uuid, e.getMessage()); } } } // WebSocket连接管理器 class WebSocketConnectorLocal { private static final int MAX_TEXT_BUFFER = 524288; private static final int MAX_BINARY_BUFFER = 524288; public static void connectAndSubscribe(VMSConfigLocal config, int requestCount) { try { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.setDefaultMaxTextMessageBufferSize(MAX_TEXT_BUFFER); container.setDefaultMaxBinaryMessageBufferSize(MAX_BINARY_BUFFER); List<Transport> transports = Arrays.asList( new WebSocketTransport(new StandardWebSocketClient(container)), new RestTemplateXhrTransport() ); SockJsClient webSocketClient = new SockJsClient(transports); WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient); // 配置消息转换器 List<MessageConverter> converters = Arrays.asList( new MappingJackson2MessageConverter(), new StringMessageConverter(), new ByteArrayMessageConverter() ); stompClient.setMessageConverter(new CompositeMessageConverter(converters)); // 构建连接URL String url = String.format("wss://127.0.0.1:8081/api/vms/%s/ws/status", config.getVmsId()); // 设置HTTP头 WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); headers.set("Cookie", config.getCookie()); headers.set("CSRF-TOKEN", config.getCsrfToken()); headers.set("SourceType", "vms_web"); headers.set("Content-Type", "application/json;charset=UTF-8"); // 设置STOMP头 StompHeaders connectHeaders = new StompHeaders(); connectHeaders.set("CSRF-TOKEN", config.getCsrfToken()); connectHeaders.set("accept-version", "1.1,1.0"); // 创建连接 stompClient.connect(url, headers, connectHeaders, new StompSessionHandlerAdapter() { @Override public void afterConnected(StompSession session, StompHeaders connectedHeaders) { System.out.println("************ WebSocket连接成功 VMSID:" + config.getVmsId() + "*****\n"); ExecutorService requestExecutor = Executors.newFixedThreadPool(requestCount); for (int i = 0; i < requestCount; i++) { String uuid = "disorder-" + UUID.randomUUID().toString().substring(0, 8); // 构建真实订阅路径 String realTopic = String.format( "/topic/vms/%s/users/%s/device-add-progress/%s/v2", config.getVmsId(), config.getUserId(), uuid ); // 订阅消息 // String subscribeUrl = "/topic/vms/{vmsId}/users/{userId}/device-add-progress/{uuid}/v2"; session.subscribe(realTopic, new StompFrameHandler() { @Override public Type getPayloadType(StompHeaders headers) { if (headers.getContentType() != null && headers.getContentType().toString().contains("application/json")) { return Map.class; } return byte[].class; } @Override public void handleFrame(StompHeaders headers, Object payload) { if (payload instanceof byte[]) { String jsonStr = new String((byte[]) payload, StandardCharsets.UTF_8); System.out.println("原始JSON消息: " + jsonStr); } // 处理自动转换的JSON对象 else if (payload instanceof Map) { Map<?, ?> jsonMap = (Map<?, ?>) payload; System.out.println("解析后的JSON消息: " + jsonMap); } // 处理字符串 else if (payload instanceof String) { System.out.println("文本消息: " + payload); } } }); // 延迟后发送请求(确保订阅生效) final String finalUuid = uuid; requestExecutor.execute(() -> { try { Thread.sleep(100); // 100ms延迟确保订阅注册完成 HttpUtilForLocal.sendDemoRequest(config, finalUuid); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); } requestExecutor.shutdown(); } }); } catch (Exception e) { System.err.println("WebSocket连接异常 VMSID:" + config.getVmsId()); e.printStackTrace(); } } } @SpringBootApplication public class WebsocketClientApplication { private static final int PARALLEL_REQUESTS_PER_VMS = 1; // 每个vmsId的请求数 public static void main(String[] args) throws InterruptedException { SSLUtil.disableSSLVerification(); // 1. 准备测试用的vmsId配置列表 List<VMSConfigLocal> vmsConfigs = Arrays.asList( // 主测试vmsId new VMSConfigLocal( "demo_vms", "JSESSIONID=C2E3CC056311006FCC75B6398001B4ED; VMS_SID=v-ca119f6c-e0b2-4d55-91d8-8cd5c0091c8b", "fec60c7ab64e4e2ba1ddcda283f8e372", "68c269674804b811bea339e3" ) // 额外测试vmsId(示例) // new VMSConfig( // "a84976add940407cbd7a76d66f5e8602", // "VMS_SID=a1-56563ebd-d42c-4f86-a924-94a175659e5b; JSESSIONID=BF89313521CE8BEC0ACCF2141CC5913D", // "809124f81f5d439db4de216f9831cc8c", // "userId101" // ), // new VMSConfig( // "a84976add940407cbd7a76d66f5e8603", // "VMS_SID=a1-56563ebd-d42c-4f86-a924-94a175659e5b; JSESSIONID=BF89313521CE8BEC0ACCF2141CC5913D", // "809124f81f5d439db4de216f9831cc8c", // "userId102" // ) ); // 2. 为每个vmsId创建WebSocket连接和订阅,订阅之后并行发送HTTP请求 vmsConfigs.forEach(config -> WebSocketConnectorLocal.connectAndSubscribe(config, PARALLEL_REQUESTS_PER_VMS)); System.out.println("客户端已启动,等待消息..."); Thread.sleep(Long.MAX_VALUE); } } 这是客户端的代码,怎么修改
最新发布
11-09
这是postman的url:https://aps1-vms-api-alpha3.tplinkcloud.com/api/v2/vms/a84976add940407cbd7a76d66f5e86e7/sites/1707841329070081/cloud/demosend,header包括cookie和csrf-token,body为{ "total":50, "uuid":"disorder008" },怎么结合这个请求,和客户端,package com.tplink.cloud.demo.websocket_client; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import javax.websocket.ContainerProvider; import javax.websocket.WebSocketContainer; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.convert.ConversionFailedException; import org.springframework.messaging.converter.ByteArrayMessageConverter; import org.springframework.messaging.converter.CompositeMessageConverter; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.StringMessageConverter; 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.web.socket.WebSocketHttpHeaders; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.messaging.WebSocketStompClient; import org.springframework.web.socket.sockjs.client.RestTemplateXhrTransport; import org.springframework.web.socket.sockjs.client.SockJsClient; import org.springframework.web.socket.sockjs.client.Transport; import org.springframework.web.socket.sockjs.client.WebSocketTransport; @SpringBootApplication public class WebsocketClientApplication { // private static CountDownLatch latch; // private static long startTime; public static void main(String[] args) throws InterruptedException { // 禁用SSL验证 SSLUtil.disableSSLVerification(); // WebSocketClient webSocketClient = new StandardWebSocketClient(); List<Transport> transports = new ArrayList<>(2); WebSocketContainer container = ContainerProvider.getWebSocketContainer();//262144 container.setDefaultMaxTextMessageBufferSize(262144); container.setDefaultMaxBinaryMessageBufferSize(262144); transports.add(new WebSocketTransport(new StandardWebSocketClient(container))); transports.add(new RestTemplateXhrTransport()); SockJsClient webSocketClient = new SockJsClient(transports); WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient); List<MessageConverter> converters = new ArrayList<>(); converters.add(new MappingJackson2MessageConverter()); // 处理JSON负载 converters.add(new StringMessageConverter()); // 处理文本负载 converters.add(new StringToByteArrayConverter()); // 添加自定义转换器 converters.add(new ByteArrayMessageConverter()); // 处理二进制负载 stompClient.setMessageConverter(new CompositeMessageConverter(converters)); // stompClient.setMessageConverter(new StringMessageConverter()); // String url1 = "/api/vms/{vmsId}/ws/status"; String vmsId = "a84976add940407cbd7a76d66f5e86e7"; String url = String.format("wss://aps1-vms-api-alpha3.tplinkcloud.com/api/vms/%s/ws/status", vmsId); // String url = "wss://127.0.0.1:8081/api/vms/vms-8ff225f900a44a90a937143fe6774a98/ws/status/230/xgydnmu0/websocket"; // 添加头,握手的那些http,比如cookie final WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); headers.set("Cookie", "VMS_SID=a1-56563ebd-d42c-4f86-a924-94a175659e5b; JSESSIONID=C433B2576C0922E8101F025B40FBAFD9"); headers.set("CSRF-TOKEN", "809124f81f5d439db4de216f9831cc8c"); headers.set("SourceType", "vms_web"); headers.set("Content-Type", "application/json;charset=UTF-8"); // 头部字段 final StompHeaders connectHeaders = new StompHeaders(); connectHeaders.set("CSRF-TOKEN", "809124f81f5d439db4de216f9831cc8c"); connectHeaders.set("accept-version", "1.1,1.0"); // connectHeaders.set("heart-beat", "20000,20000"); // 链接到服务端 stompClient.connect(url, headers, connectHeaders, new StompSessionHandlerAdapter() { @Override public void afterConnected(StompSession session, StompHeaders connectedHeaders) { System.out.println("************connected"); // 订阅用户消息,"/topic/vms/{vmsId}/users/{userId}/device-add-progress/{uuid}" String subscribeUrl = "/topic/vms/{vmsId}/users/{userId}/device-add-progress/{uuid}/v2"; System.out.println("subscribeUrl: " + subscribeUrl); session.subscribe(subscribeUrl, new StompFrameHandler() { // @Override // public Type getPayloadType(StompHeaders headers) { // // 直接返回 Map.class,跳过二进制检查 // return Map.class; // } // @Override // public void handleFrame(StompHeaders headers, Object payload) { // if (payload instanceof Map) { // System.out.println("订阅响应: " + payload); // } // } @Override public Type getPayloadType(StompHeaders headers) { if (headers.getContentType() != null && headers.getContentType().toString().contains("application/json")) { return Map.class; // 或自定义DTO类 } return byte[].class; // 默认返回字节类型 } @Override public void handleFrame(StompHeaders headers, Object payload) { if (payload instanceof byte[]) { String jsonStr = new String((byte[]) payload, StandardCharsets.UTF_8); System.out.println("原始JSON消息: " + jsonStr); } // 处理自动转换的JSON对象 else if (payload instanceof Map) { Map<?, ?> jsonMap = (Map<?, ?>) payload; System.out.println("解析后的JSON消息: " + jsonMap); } // 处理字符串 else if (payload instanceof String) { System.out.println("文本消息: " + payload); } } }); } @Override public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) { System.err.println("STOMP Exception: " + exception.getMessage()); } @Override public void handleTransportError(StompSession session, Throwable exception) { System.err.println("Transport Error: " + exception.getMessage()); if (exception instanceof ConversionFailedException) { System.out.println("Conversion Failed"); } exception.printStackTrace(); // 关键:添加堆栈信息 } }); System.out.println("客户端已启动,阻塞主线程等待消息..."); Thread.sleep(Long.MAX_VALUE); // 永久阻塞主线程 } } 并行发起同uuid的多次http请求
11-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值