2008-12-07 139 views
3

我需要從我的應用程序中從安全的Web位置獲取文件到內存中。我有要捕獲的文件的URL,但似乎無法解決安全問題。下面是來自Cookbook samples page代碼:Groovy安全文件下載

def download(address) 
{ 
    def file = new FileOutputStream(address.tokenize("/")[-1]) 
    def out = new BufferedOutputStream(file) 
    out << new URL(address).openStream() 
    out.close() 
} 

,這裏是應返回的文件內容的字節數組相同功能的我的「記憶」的版本:

def downloadIntoMem(address) 
{ // btw, how frickin powerful is Groovy to do this in 3 lines (or less) 
     def out = new ByteArrayOutputStream() 
     out << new URL(address).openStream() 
     out.toByteArray() 
} 

當我嘗試這對不安全URL(選擇你可以在網上找到的任何圖像文件),它工作得很好。但是,如果我選擇需要用戶/密碼的網址,則不可以。

好的,在這方面做了更多的工作。看起來Authenticator方法確實工作,但在一個圓滿的方式。我第一次訪問這個URL時,我得到了一個302位置的登錄服務器響應。如果我使用身份驗證器設置訪問該位置,那麼我會獲得另一個具有Cookie的302,並且該位置將恢復爲原始網址。如果我然後訪問原件,則正確下載。

所以,我不得不模仿一個瀏覽器,但最終它的一切工作。

使這個社區維基,所以其他人可以添加其他方法。

謝謝!

回答

10

如果URL上的信用不起作用,您可以使用它。它適用於基本身份驗證。

new File(localPath).withOutputStream { out -> 
    def url = new URL(remoteUrl).openConnection() 
    def remoteAuth = "Basic " + "${user}:${passwd}".bytes.encodeBase64() 
    url.setRequestProperty("Authorization", remoteAuth); 
    out << url.inputStream 
} 

希望幫助!

3

根據一種身份驗證服務器的,你可以把vim的信任狀的URL本身:

def address = "http://admin:[email protected]" 
def url = new URL(address) 
assert "admin:sekr1t" == url.userInfo 

如果你不通過代理去,你不想做代理你所指的東西。這不適用。

+0

今天下午我會試一試,謝謝! – billjamesdev 2008-12-07 15:11:52

+1

好吧,我試過了,不行。我猜想安全性不是那麼基本。我認爲登錄服務器會將信息放入Cookie或正在訪問的eRoom應用程序的會話中。 – billjamesdev 2008-12-08 04:06:42