最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript前端無法獲取響應(yīng)頭原因與解決方案

 更新時間:2025年08月19日 08:50:09   作者:小小愿望  
這篇文章主要為大家詳細(xì)介紹了JavaScript前端無法獲取響應(yīng)頭原因與解決方案,如 Content-Disposition,下面小編就來和大家詳細(xì)介紹一下吧

一、問題背景

在前后端分離項目中,前端通過 AJAX 或 Fetch 請求接口時,發(fā)現(xiàn)無法獲取響應(yīng)頭中的 Content-Disposition(用于文件下載的文件名指定)但是在瀏覽器開發(fā)者工具的 Network 面板中,可以看到Content-Disposition,就是取不到值。例如:

  • 后端已設(shè)置 Content-Disposition: attachment; filename="test.txt"
  • 前端嘗試通過 response.headers['content-disposition'] 獲取時返回 null

二、核心原因

1. CORS 默認(rèn)隱藏非簡單響應(yīng)頭

瀏覽器默認(rèn)只允許前端訪問有限的“簡單響應(yīng)頭”(如 Cache-Control、Content-Type 等),而 Content-Disposition 等自定義響應(yīng)頭默認(rèn)被隱藏。

2. 未顯式暴露目標(biāo)響應(yīng)頭

服務(wù)器雖設(shè)置了 Content-Disposition,但未通過 Access-Control-Expose-Headers 明確允許前端訪問該頭,導(dǎo)致前端無法讀取。

三、解決方案

1. 后端配置 CORS,暴露目標(biāo)響應(yīng)頭

原理

通過 Access-Control-Expose-Headers 指定允許前端訪問的響應(yīng)頭。

實現(xiàn)示例

Spring Boot (Java)

response.setHeader("Content-Disposition", "attachment; filename=\"test.txt\"");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

Node.js (Express)

const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors({
    origin: 'http://frontend-domain', // 或 '*' 允許所有域名
    exposedHeaders: ['Content-Disposition'], // 關(guān)鍵配置
}));

app.get('/download', (req, res) => {
    res.set('Content-Disposition', 'attachment; filename="test.txt"');
    res.send('File content');
});

app.listen(3000);

Nginx 反向代理

server {
    listen 80;
    server_name your-domain.com;

    location /api/ {
        proxy_pass http://backend-server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        add_header Access-Control-Expose-Headers "Content-Disposition"; // 關(guān)鍵配置
    }
}

2. 確保后端正確設(shè)置Content-Disposition

示例

response.setHeader("Content-Disposition", "attachment; filename=\"test.txt\"");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

注意事項:

  • 避免僅在本地調(diào)試時設(shè)置該頭,需確保生產(chǎn)環(huán)境代碼中也包含。
  • 動態(tài)生成文件名的場景需注意特殊字符處理(如引號、空格等)。

3. 前端正確獲取響應(yīng)頭

示例代碼

// 使用 Fetch API 獲取響應(yīng)頭并觸發(fā)下載
fetch('https://api.example.com/download')
    .then(response => {
        // 獲取 Content-Disposition 頭
        const disposition = response.headers['content-disposition'];
        if (disposition && disposition.includes('attachment')) {
            const filename = disposition.split('filename=')[1].replace(/["']/g, '');
            return response.blob().then(blob => {
                // 創(chuàng)建下載鏈接
                const url = window.URL.createObjectURL(blob);
                const a = document.createElement('a');
                a.href = url;
                a.download = filename;
                document.body.appendChild(a);
                a.click();
                a.remove();
                window.URL.revokeObjectURL(url);
            });
        }
        return response.json(); // 處理其他情況
    })
    .catch(error => console.error('Error:', error));

五、驗證步驟

直接訪問接口:在瀏覽器地址欄輸入 http://localhost:8080/download,應(yīng)自動觸發(fā)文件下載。

跨域請求測試:將前端部署到其他域名(如 http://localhost:3000),點擊按鈕觸發(fā)下載。

檢查響應(yīng)頭:在瀏覽器開發(fā)者工具的 Network 面板中,確認(rèn)響應(yīng)頭包含:

  • Access-Control-Expose-Headers: Content-Disposition
  • Content-Disposition: attachment; filename="test.txt"

六、常見問題排查

問題1:前端仍然無法獲取 Content-Disposition

解決:檢查后端是否真正配置了 exposedHeaders,代理服務(wù)器是否轉(zhuǎn)發(fā)了該頭。

問題2:文件下載失敗但接口返回正常

解決:確保后端正確設(shè)置 Content-Disposition,且文件路徑有效,前端請求時設(shè)置responseType: 'blob'

問題3:下載文件無法打開

解決:確保前端請求時設(shè)置responseType: 'blob'。

通過以上配置,前端即可安全地獲取 Content-Disposition 等自定義響應(yīng)頭,實現(xiàn)文件下載功能。

相關(guān)文章

  • javaScript中的空值和假值

    javaScript中的空值和假值

    JavaScript 是世界上最流行的編程語言。javaScript中有五種空值和假值,分別為false,null,undefined,“”,0。從廣義上來說,這五個值都是對應(yīng)數(shù)據(jù)類型的無效值或空值
    2017-12-12
  • js實現(xiàn)單擊圖片放大圖片的方法

    js實現(xiàn)單擊圖片放大圖片的方法

    這篇文章主要介紹了js實現(xiàn)單擊圖片放大圖片的方法,涉及javascript操作圖片的技巧與onclick事件的用法,需要的朋友可以參考下
    2015-02-02
  • 微信小程序聊天功能的示例代碼

    微信小程序聊天功能的示例代碼

    這篇文章主要介紹了微信小程序聊天功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 非常不錯的功能強大代碼簡單的管理菜單美化版

    非常不錯的功能強大代碼簡單的管理菜單美化版

    由于網(wǎng)盤不穩(wěn)定,很多時候文件提示找不到,幸好U盤里存了. 喜歡這3個風(fēng)格的朋友們別在PM我啦.....我把文件傳到我服務(wù)器上了..
    2008-07-07
  • JS判斷網(wǎng)頁廣告是否被瀏覽器攔截過濾的代碼

    JS判斷網(wǎng)頁廣告是否被瀏覽器攔截過濾的代碼

    這篇文章主要介紹了JS判斷網(wǎng)頁廣告是否被瀏覽器攔截過濾的代碼,需要的朋友可以參考下
    2015-04-04
  • 驅(qū)動事件的addEvent.js代碼

    驅(qū)動事件的addEvent.js代碼

    驅(qū)動事件的addEvent.js代碼...
    2007-03-03
  • 微信小程序中實現(xiàn)雙向綁定的實戰(zhàn)過程

    微信小程序中實現(xiàn)雙向綁定的實戰(zhàn)過程

    最近在小程序的開發(fā)過程中,需要用到雙向綁定,遇到報錯才知道微信本身是不支持對象雙向綁定的,折騰一番找到解決方案,下面這篇文章主要給大家介紹了關(guān)于微信小程序中實現(xiàn)雙向綁定的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • JavaScript實現(xiàn)移動端短信驗證碼流程介紹

    JavaScript實現(xiàn)移動端短信驗證碼流程介紹

    這篇文章主要為大家詳細(xì)介紹了javascript實現(xiàn)移動端發(fā)送短信驗證碼案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • 深入分析Javascript跨域問題

    深入分析Javascript跨域問題

    JavaScript出于安全方面的考慮,不允許跨域調(diào)用其他頁面的對象。但在安全限制的同時也給注入iframe或是ajax應(yīng)用上帶來了不少麻煩。這里把涉及到跨域的一些問題簡單地整理一下
    2015-04-04
  • 微信小程序如何調(diào)用新聞接口實現(xiàn)列表循環(huán)

    微信小程序如何調(diào)用新聞接口實現(xiàn)列表循環(huán)

    這篇文章主要介紹了微信小程序如何調(diào)用新聞接口實現(xiàn)列表循環(huán),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07

最新評論

讷河市| 三明市| 克什克腾旗| 长乐市| 叙永县| 尤溪县| 西和县| 双牌县| 苏尼特右旗| 金平| 新沂市| 甘德县| 武汉市| 彭阳县| 新昌县| 武宣县| 措勤县| 淄博市| 搜索| 芦溪县| 永仁县| 定襄县| 五大连池市| 平罗县| 隆林| 全椒县| 大渡口区| 浑源县| 武清区| 思南县| 惠东县| 蓝山县| 封丘县| 赣州市| 双城市| 兴安盟| 繁昌县| 万年县| 清镇市| 临颍县| 卢湾区|