2011-11-29 20 views
2

我想從applet上運行的瀏覽器中上傳文件(日誌文件)。我正在讀取字符串中的文件。以下函數給出一個字符串數據和一個字符串URL(例如:http://192.168.0.166:8380/app/customer/UploadData.do),將數據上傳到一個URL。由於在超時後與服務器的會話丟失。因此,我在URL中添加了用戶名和密碼,以避免任何會話過期問題(因爲此上傳應該是自動的,無需任何手動輸入等)。該URL(不公開)看起來像:使用HTTP連接從java上傳文件

http://192.168.0.166:8380/app/customer/UploadData.do?username=uname&password=pword

public static void sendData(String aData, String aURL) throws Exception { 
    try { 
     byte[] myData = aData.getBytes(); 
     /* Uploading the data */ 
     URL myURL = new URL(aURL); 
     HttpURLConnection myConnection = (HttpURLConnection) myURL.openConnection(); 
     myConnection.setDoOutput(true); 
     myConnection.setUseCaches(false); 
     myConnection.setDefaultUseCaches(false); 
     myConnection.setRequestProperty("Content-type", "application/octet-stream"); 
     OutputStream myOutputStream = myConnection.getOutputStream(); 
     myOutputStream.write(myData); 
     myOutputStream.flush(); 
     myOutputStream.close(); 

     int status = ((HttpURLConnection) myConnection).getResponseCode(); 

    } catch (Exception exception) { 
     throw exception 
    } 
} 

此功能完全正常,只要與服務器的會話是活的。當例如會話過期或用戶註銷時(applet運行24/7),它不起作用。請注意,上述網址在通過網絡瀏覽器訪問時效果很好。它的Java代碼(applet)在會話過期時不能再次連接。如果有人能指出我在這裏做錯了什麼,這將會非常有幫助。任何幫助將不勝感激。

環境: Jboss作爲應用服務器和JBoss Secured Realm登錄。

+0

NO ANSWER。 (這不是HTTP POST。)我必須考慮會話cookie。也許你應該先分別進行登錄,然後使用會話cookie/url重寫。 setDoInput(false)不會傷害。 –

+0

@Joop Eggen:感謝您的糾正,我更新了標題。 –

回答

1

您正在查詢的網頁是否接受登錄並根據您發送的用戶名/密碼參數創建新會話?

如果用戶通過標準方法登錄到網站(例如他們在瀏覽器中輸入他們的詳細信息的登錄頁面),那麼這將創建一個來回發送的cookie,將它們標識爲「所有者」並驗證它們(直到它超時)。如果他們然後運行你的小程序,那麼你的小程序將最終捎帶該會話和cookie,直到它過期。

如果它過期了,你的applet將需要做同樣的事情,用戶做了登錄,很可能做一個HTTP POST到登錄頁面,除非上傳頁面明確接受用戶名和密碼,並且不需要會話或創建一個然後你正在嘗試將無法正常工作。

您可以查看錶單的登錄頁面,然後讓applet查詢該頁面,解析cookie的輸出HTTP標頭並將其傳回上傳。

如果一個簡單的解決方案失敗了,可能會讓您的小程序定期查詢網站(每小時或每20分鐘一次)以防止會話超時。它不一定需要上傳 - 它可以查詢可能的任何受限制的頁面。

1

問題出在您的服務器實現中,而不是在客戶端代碼中。當客戶端程序連接到服務器時,您不應該使用會話來識別用戶。在Web瀏覽器上下文中使用會話更爲合適。

從靜默程序連接到服務器時,應該使用Basic Authentication方法。這可以通過將Authorization標頭添加到上傳請求中完成,並且服務器解析它以獲取用戶名和密碼。它比在您的網址中輸入用戶名和密碼稍安全一些。還有其他身份驗證方法,您可能需要查看一下。

+0

感謝您的迴應:)。我使用Jboss作爲服務器和'JBoss Secured Realm'來提高安全性。登錄由Jboss管理。 –

+0

然後使用與您設置的領域相匹配的認證方法。 – gigadot

+0

如果您使用正確的身份驗證方法,那麼您的會話應該由JBoss重新創建。大多數服務器使用基本認證,因爲它很容易。 – gigadot

0

HttpClient可能在這裏有所幫助:一個HTTP PUT。

+0

您能否詳細說明一下?鏈接也會有幫助。 –

+0

有關文件上傳(HTTP PUT)和其他示例的示例,請參閱http://www.innovation.ch/java/HTTPClient/getting_started.html –