項目場景:
之前的話寫過csdn,最近出現了一些小事情,所以耽誤了好久沒有更新,最近把以前的項目拿出來然后改了下環境就出現了一些問題,該項目使用SpringBoot3.5?+ SpringMVC + Mybatis-Plus3.5.0,然后權限控制采用的是SpringSecurity等,因為問題主要出現在這幾個部分,所以我就不介紹項目的廢話了,直接開始。
問題描述
在修改項目版本的時候,舊版本很多的一些東西都被優化掉了,最近遇見的主要問題就是三個:1.版本與版本不兼容的問題;2.mysql數據庫突然無法使用,密碼連接失效;3.上傳產品圖片時出現控制臺不報錯但是無法顯示圖片的情況;如果有朋友是因為1,2出了問題的話可以去博客園,里面有解決的具體辦法,我今天主要寫的是圖片上傳失敗問題。
原因分析:
原本的代碼主要出現的問題是:
缺少 CSRF 防護
未攜帶 CSRF Token,在 Spring Security 環境下會被攔截,導致請求失敗(403 錯誤)。
存在安全風險,容易受到跨站請求偽造(CSRF)攻擊。
響應數據處理不夠健壯
直接訪問?
result.data[0]
,未校驗?result.data
?是否存在或是否為空數組,可能導致?TypeError
(如?Cannot read properties of undefined
)。沒有錯誤處理邏輯,上傳失敗時用戶無明確反饋。
代碼可讀性和維護性較差
未對關鍵變量(如圖片 URL)進行提取,代碼邏輯不夠清晰。
缺少必要的注釋,不利于后續維護。
之后修改完的代碼與原本的代碼相比優點:
安全性更高:集成 CSRF 防護,避免被 Spring Security 攔截或遭受攻擊。
代碼更健壯:通過變量提取和結構化編寫,減少潛在錯誤。
更易維護:清晰的代碼風格便于后續擴展和調試。
這個改進建議是我去將改好的代碼發給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>
最后,也希望有更好的辦法的話反饋給我,一起學習,謝謝大家了!!!