2011-12-14 160 views
13

如果我們的確做了window.location = "http://MyApi.com/Pdf";,瀏覽器將獲得URL http://MyApi.com/Pdf。但是,如果我們希望在執行URL的GET之前設置請求的標頭authentication,因爲服務器是REST服務器,並且它不支持cookie。這個怎麼做?JavaScript - 如何爲瀏覽器設置請求標題GET

在所有情況下,我使用$.ajax來呼叫服務,但是這次我需要在新窗口中顯示響應。響應是一個PDF文件內容。

在此先感謝。

回答

8

在最近的瀏覽器,您可能能夠使用斑點:

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
<button onclick="tryit();">PDF</button> 
<script> 
    function tryit() { 
     var win = window.open('_blank'); 
     downloadFile('/pdf', function(blob) { 
      var url = URL.createObjectURL(blob); 
      win.location = url; 
     }); 
    } 
    function downloadFile(url, success) { 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', url, true); 
     xhr.setRequestHeader("Authorization", "Basic " + btoa("username:password")); 
     xhr.responseType = "blob"; 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == 4) { 
       if (success) success(xhr.response); 
      } 
     }; 
     xhr.send(null); 
    } 

</script> 
</body> 
</html> 

在IE中,詢問用戶:

window.navigator.msSaveOrOpenBlob(blob, 'readme.pdf'); 

附: 可以在節點測試後端:

router.get('/pdf', function(req, res) { 
    if(req.headers.authorization !== 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=') return res.status(403).send('Not allowed'); 
    res.sendFile(path.join(__dirname, 'public', 'render.pdf')); 
}); 
router.get('/', function(req, res) { 
    res.render('index'); 
}); 
-2

您應該使用beforeSend配置$.ajax。下面是一個例子,但當然我不知道確切的設置是否適合你,沒有任何代碼可以查看。

$.ajax({ 
    url : '/model/user.json', 
    dataType : 'json', 
    'beforeSend' : function(xhr) { 
      var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
      var base64 = Crypto.util.bytesToBase64(bytes); 
      xhr.setRequestHeader("Authorization", "Basic " + base64); 
    }, 
    error : function(xhr, ajaxOptions, thrownError) { 
     reset(); 
     onError('Invalid username or password. Please try again.'); 
     $('#loginform #user_login').focus(); 
    }, 
    success : function(model) { 
     cookies(); 
      ... 
    } 
}); 

爲了這個工作,你需要crypto-js

+0

並不完全回答我相信這個問題的反應是由瀏覽器呈現PDF文檔。 – 2011-12-14 13:38:49

+0

讓我再澄清。我不需要爲ajax請求設置標題。我想爲頁面的完整GET請求設置標題。我已經使用`beforeSend`來設置所有ajax請求的標題。 – IsmailS 2011-12-14 14:15:57

1

如果你不關心隱藏或混淆用戶證書然後只使用純GET認證: 使用http://username:[email protected]/代替http://MyApi.com/

+0

非常感謝您的回覆。我有一個自定義身份驗證機制。 :(所以`授權`頭的值看起來像`CompanyNameToken `。我不介意在URL中包含令牌,如果有可能像這樣的一些怪癖 – IsmailS 2011-12-14 14:14:07

1

是否必須是一個GET?

我問的原因是,你可能只是有一個POST表單(到一個目標=「_ BLANK」),只是在新窗口中顯示嵌入文件。當然,這並不能解決你的自定義頭文件的問題,但是因爲你也可以使用jquery.ajax進行POST - 這可以讓你設置自己的頭文件,所以你將擁有兩全其美的優點。

這是一個jQuery plugin,它動態創建這樣一個表單,以便下載任何文件。您可以使用此作爲參考......

希望這有助於

相關問題