2013-03-13 5 views
1

클라이언트가 화면 인쇄 버튼을 클릭 할 때마다 클라이언트 컴퓨터에 저장하기 위해 웹 페이지 화면을 캡처해야합니다. 이걸 내가 봤 거든 애플릿을 서명 (신뢰할 수있는 애플릿)을 포함하여 내 JSP 페이지에 포함 시켜서이 작업을 수행 할 수 있습니다. 그래서 독립형 자바 클래스를위한 간단한 애플릿을 시도하고있다. 성공에 나는 애플릿에 서명 한 후 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

이 문제가 해결되었습니다.

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

* "나는이 문제를 해결했습니다." 생산에 이르기까지 단순히 문제를 지연 시켰습니다. 프로덕션 시간에 정책 파일은 실용적이지 않을 것이며 앱이됩니다. '로봇 '을 사용하기 위해서는 디지털 서명 (사용자)과 신뢰 (최종 사용자)가 필요합니다. –

+0

@ Andrew : 나는 당신을 못 봤어요? 왜 그것이 "생산까지 문제를 지연 시켰는지"와 같은 이유에 대해 좀 더 설명해 주시겠습니까? LISAR 기술을 기반으로하는 GIS Scanning 회사에서 일하고 Java 개발을 위해 나는 한 사람의 군대입니다 (온라인 도움을 제외하고는 아무도 저를 도와 줄 수 없습니다). –

+1

최종 사용자가 정책 파일을 엉망으로 만들 것이라고 예상 할 수 없습니다. 그것은 안전하지 않으며, 그들의 이해를 넘어서는 길입니다. 따라서 최종 사용자의 컴퓨터에서 작동하는 신뢰할 수있는 애플릿을 얻으려면 디지털 서명이 필요합니다. 디지털 서명이 필요하기 때문에 지금까지도 작업 할 수 있습니다. Ant 빌드 스크립트는 각 빌드를 Jar하고 서명 할 수 있습니다. –

2

난 그냥 한 java.policy 파일에 다음 줄을 붙여 한 모든 (당신의 자바 설치 폴더에이 파일을 검색하고 3 개 장소에서 그것을 얻을 것이며, 모든 파일의 마지막에이 붙여 넣어야) 나는 문제가 발생한 1 년 후에 공룡을 파 냈다.하지만 나는 똑같은 문제에 직면 해왔다. 누군가가 말했듯이 정책 파일을 변경하는 것은 매우 나쁜 생각입니다 (일부 사용자에게는 불편 함, 제 경우에는 완전히 용인 할 수없는 해결책 임).

유효한 맨 니 퍼스트가있는 서명 된 애플릿에서 동일한 문제가 발생했습니다. 문제는 보안 관련 메서드를 호출하는 방식이었습니다. 그것을 할 수있는 깨끗한 방법은 그

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

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

:이 경우 당신은 라인을 교체해야합니다. 올바른 certyficate를 사용하여 서명 된 appled에서 mannifest와 jnpl 파일에 올바른 보안 항목이 있으면 완벽하게 작동합니다.