关于记录一下“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>标签中的代码,相关修改代码片段一,片段二代码如下:

javascript 复制代码
// 代码片段一

<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 名
    }
});
javascript 复制代码
// 代码片段二
                   <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>

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

相关推荐
杨杨杨大侠5 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
破茧蝴蝶5 小时前
Python分布式爬虫完整教程
开发语言·python
狗凯之家源码网5 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
凤山老林6 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
远离UE46 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience6 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
Thinker QAQ6 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
栈帧之外7 小时前
【C++】STL之set
开发语言·c++
霸道流氓气质7 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路7 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库