2013-03-13 51 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文件中具有正确的安全条目,它的工作原理非常完美。