2016-01-19 56 views
0

我正嘗試使用Amazon的SDK將文件從Java applet上傳到Amazon S3。該applet位於運行Spring的Web服務器上。在Spring服務器上初始化Java Applet中的AWS

問題是,在我嘗試上傳我的文件之前,我需要初始化Amazon S3客戶端。這通常是非常簡單的:

AWSCredentials credentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY); 
AmazonS3Client s3Client = new AmazonS3Client(credentials); 

但是,當我這樣做,第二行(不管證書是否正確與否)觸發此錯誤消息:

java.lang.ClassFormatError: Incompatible magic value 1008813135 in class file <!DOCTYPE html> 
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_66] 
    at java.lang.ClassLoader.defineClass(Unknown Source) ~[na:1.8.0_66] 
    at java.security.SecureClassLoader.defineClass(Unknown Source) ~[na:1.8.0_66] 
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) ~[na:na] 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) ~[na:na] 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) ~[na:na] 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) ~[na:na] 
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.8.0_66] 
    at org.apache.commons.logging.LogFactory.createFactory(LogFactory.java:1131) ~[upload.jar:na] 
    at org.apache.commons.logging.LogFactory$2.run(LogFactory.java:1065) ~[upload.jar:na] 
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_66] 
    at org.apache.commons.logging.LogFactory.newFactory(LogFactory.java:1062) ~[upload.jar:na] 
    at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:569) ~[upload.jar:na] 
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685) ~[upload.jar:na] 
    at com.amazonaws.AmazonWebServiceClient.<clinit>(AmazonWebServiceClient.java:56) ~[upload.jar:na] 

這裏發生的是AWS庫正在嘗試初始化其日誌記錄系統,因此它開始搜索將處理任何內部日誌記錄消息的LogFactory。問題是,它開始在小程序外搜索,通過使對

http://localhost/...myUrl.../commons-logging.properties 

GET請求(我發現了這一點,從這裏的文檔:https://commons.apache.org/proper/commons-logging/apidocs/org/apache/commons/logging/package-summary.html

現在,一個邊注:我security-app-context.xml文件對Spring包含以下入口點豆,以確保非認證的用戶只能看到登錄頁面:

<beans:bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <beans:constructor-arg value="/loginPage" /> 
</beans:bean> 

這是在這個階段,我的春節,建立更爲醒目的GET請求,並將其重定向到服務器登錄頁面。此重定向最終將發送一個有效的HTML頁面作爲此GET請求的結果。 HTML頁面的第一行是「',日誌框架解析並嘗試使用它來初始化Java類。顯然,一個名爲.class的類不存在,所以我得到了ClassFormatError。

有沒有辦法讓AWS庫可以很好地與這個設置一起玩?理想情況下,不禁用Spring的重定向策略。

+0

也許我錯過了一些東西......但是你真的認爲將aws憑證分發到applet是個好主意嗎? (在客戶機上運行!) – ben75

+0

這是一個公平的觀點,在正常情況下,我會同意。但是,在這種情況下,AWS憑證適用於訪問權限受到嚴格限制的帳戶,並且訪問小程序本身受到我試圖解決的相同登錄系統的保護。 –

回答

0

,你可以告訴日誌框架正是通過把此行中的某處new AmazonS3Client()調用之前找到的LogFactory實現解決特定的錯誤:

System.setProperty("org.apache.commons.logging.LogFactory", "org.apache.commons.logging.impl.LogFactoryImpl"); 

然而,你可能會發現出現了同樣的問題用不同的文件,其中兩個實際上,這次在亞馬遜的圖書館裏更深一層。再次使用GET請求搜索它們(如Java控制檯中所示)。

http://localhost/...myUrl.../com/amazonaws/services/s3/request.handlers 
http://localhost/...myUrl.../com/amazonaws/services/s3/request.handler2s 

所以,你需要一個叫做request.handlers兩者com/amazonaws/services/s3文件夾結構內的文件和另一個名爲request.handler2s,在你的類路徑的一個文件夾的com文件夾(applet的JAR文件的可能根)。這些文件應該是空的。

將LogFactory屬性設置爲阻止搜索commons-logging.properties,並且Amazon請求處理程序文件就位後,應該成功完成初始化。

(這個答案感覺有點笨拙,我不完全滿意,所以選擇非常受歡迎)。