2013-03-13 25 views
1

我需要捕獲一個網頁屏幕,以便在客戶端單擊打印屏幕按鈕時將其存儲在客戶機上。爲此,我通過在我的jsp頁面中嵌入一個帶有簽名(可信任的applet)的applet來實現這一點,我可以做到這一點。所以我正在嘗試一個獨立的java類的簡單小程序。在成功之後,我可以在簽署applet之後爲jsp嘗試它。 我試過是:java.security.AccessControlException當使用java.awt.Robot類在小程序中捕獲屏幕時

import java.applet.Applet; 
import java.awt.Graphics; 
import java.util.Date; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import javax.swing.ImageIcon; 
/* <applet code = MyApplet.class width="500" height="500">Java Applet for screen capture</applet> */ 



public class MyApplet extends Applet { 

    /* Applet Life cycle Methods */ 
    public void start() 
    { 
    try{ 
    // capture the whole screen 
    BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
    // Save as JPEG 
    File file = new File("D:/screencapture.jpg"); 
    ImageIO.write(screencapture, "jpg", file); 
    System.out.println("screen capture finished : "); 
    }//try closing... 
    catch(Exception e) 
    { 
     System.out.println("screen capture error : "); 
     e.printStackTrace(); 
    }//catch closing... 
    }//start closing... 

public void stop() 
    { 

    } 
} 

我得到這個:

java.security.AccessControlException: access denied ("java.awt.AWTPermission" "createRobot") 
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366) 
     at java.security.AccessController.checkPermission(AccessController.java:560) 
     at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
     at java.awt.Robot.checkRobotAllowed(Robot.java:170) 
     at java.awt.Robot.init(Robot.java:134) 
     at java.awt.Robot.<init>(Robot.java:96) 
     at MyApplet.start(MyApplet.java:23) 
     at sun.applet.AppletPanel.run(AppletPanel.java:474) 
     at java.lang.Thread.run(Thread.java:722) 

任何幫助,任何想法將appriciated。

回答

0

我解決了這個問題。 我所做的一切只是在粘貼java.policy文件這些行(僅搜索該文件在你的Java安裝文件夾,你會在3個地方得到它,需要在所有文件複製粘貼此最後)

permission java.awt.AWTPermission "createRobot"; 
permission java.awt.AWTPermission "accessClipboard"; 
permission java.awt.AWTPermission "accessEventQueue"; 
permission java.awt.AWTPermission "showWindowWithoutWarningBanner"; 
permission java.awt.AWTPermission "readDisplayPixels", "read"; 
permission java.io.FilePermission "<<ALL FILES>>", "read, write, delete, execute"; 
+3

*「我解決了這個問題」*不是。你只是將問題推遲到生產。在製作時,策略文件將不實用,並且應用程序。將需要數字簽名(由您)和可信賴(由最終用戶)以使用「機器人」。 – 2013-03-14 01:49:32

+0

@安德魯:我無法得到你?你能再給出一些解釋,說明爲什麼它像「把問題推遲到生產」? 由於我在基於激光雷達技術的GIS掃描公司和java開發公司工作,我是一個人的軍隊(除了在線幫助,沒有人會幫助我)。 – 2013-03-14 03:45:28

+1

你不能指望最終用戶去搞亂政策文件。這是不安全的,超出了他們的理解。因此,要獲得在最終用戶的計算機上工作的受信任的小程序,需要對其進行數字簽名。既然它需要數字簽名,那麼你現在就可以工作。 Ant構建腳本可以對每個構建的類進行Jar和簽名。 – 2013-03-14 03:48:05

2

我知道在問題發生一年後我正在挖掘恐龍,但我一直面臨同樣的問題。正如有人所說,更改政策文件是一個非常糟糕的主意(對於一些用戶來說也不舒服,就像我的情況一樣,這是完全不可接受的解決方案)。

我一直在使用有效的mannifest在簽名的applet中遇到同樣的問題。問題就在於我打電話給安全相關的方法。在這種情況下,你應該更換行:

BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 

BufferedImage screencapture = AccessController.doPrivileged(new PrivilegedAction<BufferedImage >() { 
    @Override 
    public BufferedImage run(){ 
     return new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
    } 
}); 

是乾淨的方法來做到這一點。在使用有效證書進行應用簽名時,在mannifest和jnpl文件中具有正確的安全條目,它的工作原理非常完美。