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

关于记录一下“bug”,在做图片上传的时候出现的小问题

项目场景:

之前的话写过csdn,最近出现了一些小事情,所以耽误了好久没有更新,最近把以前的项目拿出来然后改了下环境就出现了一些问题,该项目使用SpringBoot3.5 + SpringMVC + Mybatis-Plus3.5.0,然后权限控制采用的是SpringSecurity等,因为问题主要出现在这几个部分,所以我就不介绍项目的废话了,直接开始。


问题描述

在修改项目版本的时候,旧版本很多的一些东西都被优化掉了,最近遇见的主要问题就是三个:1.版本与版本不兼容的问题;2.mysql数据库突然无法使用,密码连接失效;3.上传产品图片时出现控制台不报错但是无法显示图片的情况;如果有朋友是因为1,2出了问题的话可以去博客园,里面有解决的具体办法,我今天主要写的是图片上传失败问题。


原因分析:

原本的代码主要出现的问题是:

  1. 缺少 CSRF 防护

    • 未携带 CSRF Token,在 Spring Security 环境下会被拦截,导致请求失败(403 错误)。

    • 存在安全风险,容易受到跨站请求伪造(CSRF)攻击。

  2. 响应数据处理不够健壮

    • 直接访问 result.data[0],未校验 result.data 是否存在或是否为空数组,可能导致 TypeError(如 Cannot read properties of undefined)。

    • 没有错误处理逻辑,上传失败时用户无明确反馈。

  3. 代码可读性和维护性较差

    • 未对关键变量(如图片 URL)进行提取,代码逻辑不够清晰。

    • 缺少必要的注释,不利于后续维护。

之后修改完的代码与原本的代码相比优点:

  1. 安全性更高:集成 CSRF 防护,避免被 Spring Security 拦截或遭受攻击。

  2. 代码更健壮:通过变量提取和结构化编写,减少潜在错误。

  3. 更易维护:清晰的代码风格便于后续扩展和调试。

这个改进建议是我去将改好的代码发给AI给的建议

  • 补充 error 回调,处理网络或服务器错误。

  • 增加响应数据校验(如检查 response.errno 或 response.data 是否有效)。

我后面用的代码没有采用AI的建议,需要的朋友可以为了防止出现问题可以去根据建议优化一下。


解决方案:

解决这个问题主要分两步:

1.在需要的.html文件header头部中,通过代码以下代码片段一,直接复制到里面即可;

2.在做上传文件的div里面,去加上下面的<script>标签中的代码,相关修改代码片段一,片段二代码如下:

// 代码片段一<header>
<meta name="_csrf" th:content="${_csrf.token}"/><meta name="_csrf_header" th:content="${_csrf.headerName}"/>
</header>// 获取 Token 和 Header 名称
const token = document.querySelector('meta[name="_csrf"]').content;
const header = document.querySelector('meta[name="_csrf_header"]').content;// 在 AJAX 请求中添加 CSRF 头
fetch("/api/submit", {method: "POST",headers: {[header]: token  // 动态使用 header 名}
});
// 代码片段二<script>$("#pImageFile").change(function() {$("#uploadPImage").ajaxSubmit({url: "/backstage/product/upload",type: "post",headers: {"X-CSRF-TOKEN": $("meta[name='_csrf']").attr("content")},success: function(response) {// 安全访问数组元素// 图片上传成功后,图片回显到pImage上const imageUrl = response.data[0];$("#pImage").attr("src", imageUrl);// 上传成功后,图片地址存储在hiddenPImage中$("#hiddenPImage").val(imageUrl);}});});</script>

最后,也希望有更好的办法的话反馈给我,一起学习,谢谢大家了!!!

http://www.lryc.cn/news/609343.html

相关文章:

  • 验房收房怎么避免被坑?
  • 我的世界进阶模组开发教程——伤害(2)
  • 自己实现一个freertos(2)任务调度 1——最基本的TCB
  • 深入解析HashMap:原理与性能优化
  • Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
  • spring batch处理数据模板(Reader-Processor-Writer模式)
  • Timer实现定时调度的原理是什么?
  • PPT 转高精度 PDF API 接口
  • 使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片
  • Coin Combinations I(Dynamic Programming)
  • Docker环境离线安装指南
  • 解剖 .NET 经典:从 Component 到 BackgroundWorker
  • node.js常用函数
  • GaussDB case when的用法
  • SpringBoot AI自动化测试实战案例
  • GitCode疑难问题诊疗
  • Linux命令基础(下)
  • 1.内核模块
  • 14.Redis 哨兵 Sentinel
  • 2. 字符设备驱动
  • IO流-对象流
  • 克罗均线策略思路
  • `npm error code CERT_HAS_EXPIRED‘ 问题
  • Java Stream API 编程实战
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 77-1(题目+回答)
  • 《测试驱动的React开发:从单元验证到集成协同的深度实践》
  • 【2025ICCV-目标检测方向】WaveMamba:用于 RGB-红外目标检测的小波驱动曼巴融合
  • 百度招黑产溯源安全工程师
  • SQL注入SQLi-LABS 靶场less31-38详细通关攻略
  • Maxscript在选择的可编辑多边形每个面上绘制一个内部圆形