当前位置: 首页 > news >正文

前端迟迟收不到响应,登录拦截器踩坑!

概述

最近在开发小程序登录的后端时写了一个登录拦截器,在拦截请求之后设置响应状态和响应信息之后直接返回response,结果前端迟迟收不到响应。

问题

我们先来看一下代码

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 过滤管理端接口请求//...// 对客户端请求进行验证,AUTHORIZATION为“authorization”字符串String jwtToken = request.getHeader(AUTHORIZATION);if (jwtToken == null || jwtToken.isEmpty()) {// 设置响应格式(根据前端需求调整,通常为JSON)response.setContentType("application/json;charset=UTF-8");response.setStatus(Integer.parseInt(ResponseCode.LOGIN_FAIL.getCode()));// 获取输出流并写入响应PrintWriter writer = response.getWriter();writer.println("{\"message\":\"请先登录\"}"); // 建议返回JSON格式writer.flush(); // 强制刷新缓冲区writer.close(); // 关闭输出流,确保响应发送return false;}JWTDTO jwtdto = null;try {jwtdto = jwtUtils.parseJWT(jwtToken);BaseContext.setCurrentUserId(jwtdto.getUserId());// todo 滑动刷新 jwt} catch (Exception e) {e.printStackTrace();// 设置响应格式(根据前端需求调整,通常为JSON)response.setContentType("application/json;charset=UTF-8");response.setStatus(Integer.parseInt(ResponseCode.LOGIN_FAIL.getCode()));// 获取输出流并写入响应PrintWriter writer = response.getWriter();writer.println("{\"message\":\"请先登录\"}"); // 建议返回JSON格式writer.flush(); // 强制刷新缓冲区writer.close(); // 关闭输出流,确保响应发送return false;}return true;}

一开始是这样写的,大家可以看看是否有哪里不对劲。

没错,后端接口请求响应状态码定义多了,这边我自然的就用了自定义的状态码

ResponseCode.LOGIN_FAIL.getCode()中的值为"0001",就这样前端发送完请求就迟迟不能收到后端的响应,让我疑惑了好一会。

解决

后来我把response.setStatus(Integer.parseInt(ResponseCode.LOGIN_FAIL.getCode()));

修改成了response.setStatus(401);就解决了问题

原因

为啥嘞

        因为在拦截器中设置响应状态码时,必须遵循 HTTP 协议规范,否则会导致客户端(浏览器 / 前端)无法正确处理响应,甚至出现 “迟迟收不到响应” 的问题。

HTTP 协议对状态码有明确的规定:

  • 状态码是 3 位数字(范围 100-599),且每类数字有固定含义(如 2xx 表示成功、4xx 表示客户端错误、5xx 表示服务器错误);
  • 每个状态码的语义由 IETF 规范(如 RFC 7231)定义,例如 200 表示成功、401 表示未授权、403 表示禁止访问等;
  • 不允许自定义超出规范的状态码(比如 6001000 或非数字码),这类 “自定义码” 本身不符合 HTTP 协议格式,属于无效状态码。

前端(浏览器或前端框架)接收响应时,会先校验状态码是否符合 HTTP 规范:

  • 对于合法的标准状态码(如 401403),客户端会正常解析响应体;
  • 对于无效状态码(如 6001234),客户端会认为这是 “畸形响应”,可能直接忽略该响应,或进入 “等待有效响应” 的超时状态(表现为 “迟迟收不到响应”);
  • 部分浏览器会将无效状态码的响应视为 “网络错误”,触发 error 事件但不返回具体内容,前端无法获取响应体。
http://www.lryc.cn/news/592002.html

相关文章:

  • 小结:Spring MVC 的 XML 的经典配置方式
  • ASP.NET Core Web API 内存缓存(IMemoryCache)入门指南
  • untiy之导入插件(文件方式,适用于git克隆失败)
  • Instagram千号矩阵:亚矩阵云手机破解设备指纹检测的终极方案
  • 【.net core】支持通过属性名称索引的泛型包装类
  • 五国联动!德法意西荷 ASIN 同步上架成泛欧计划硬性门槛
  • 构建智能客服Agent:从需求分析到生产部署
  • 持续同调文章阅读(四)
  • 推荐 1 款 4.5k stars 的AI 大模型驱动的开源知识库搭建系统
  • A33-vstar笔记及资料分享:搭建交叉编译环境
  • Linux云计算基础篇(9)-文本处理工具和变量
  • 无符号乘法运算的硬件逻辑实现 ————取自《湖科大教书匠》
  • 【PTA数据结构 | C语言版】多叉堆的上下调整
  • Python MP3 归一化器和长度分割器实用工具开发指南
  • SQL映射文件
  • Android 应用保活思路
  • 树(Tree)
  • 【C++基础】--多态
  • web域名解析
  • 信息论至AI实践:交叉熵的原理全景与应用深度解析
  • Github库镜像到本地私有Gitlab服务器
  • 您的企业需要服务台经理吗?-ManageEngine卓豪
  • 《5分钟开发订单微服务!飞算JavaAI实战:IDEA插件安装→空指针修复→K8s部署全流程》
  • 3C电子产品蓝光三维扫描检测方案-中科米堆CASAIM
  • 机器视觉的布料丝印应用
  • Duckdb处理excel文件
  • 【实战】一次出口连接数超限事故引发的架构反思:强制代理、NAT 网关与大厂最佳实践
  • Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel
  • LangChain 源码剖析(七)RunnableBindingBase 深度剖析:给 Runnable“穿衣服“ 的装饰器架构
  • Yoga Air 32,Yoga Air 32,Yoga AIO 9 32IRH8(F0HH,F0HJ)一体机电脑原厂Win11系统镜像