【问题标题】:Why is my applet throwing an AccessControlException?为什么我的小程序会抛出 AccessControlException?
【发布时间】:2012-05-21 01:16:07
【问题描述】:

我正在尝试构建一个名为 game 的 Java 小程序,这是我以前从未做过的事情(我一直只是构建独立的应用程序)。我的小程序在 Eclipse 中测试时运行良好,但是当我尝试将其放在我的网站上时,我在控制台中收到以下错误:

java.lang.reflect.InvocationTargetException
    at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(DeployAWTUtil.java:116)
    at sun.plugin2.applet.Plugin2Manager.runOnEDT(Plugin2Manager.java:3541)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3072)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1497)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
    at java.lang.System.getProperty(System.java:667)
    at java.io.UnixFileSystem.resolve(UnixFileSystem.java:118)
    at java.io.File.getAbsolutePath(File.java:501)
    at game.<init>(game.java:117)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at sun.plugin2.applet.Plugin2Manager$13.run(Plugin2Manager.java:3060)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:682)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:643)
    at java.awt.EventQueue$1.run(EventQueue.java:641)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:652)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception: java.lang.reflect.InvocationTargetException

上面写着access denied (java.util.PropertyPermission user.dir read),但我不知道它试图从用户的文件系统中读取内容的位置。

它还显示at game.&lt;init&gt;(game.java:117),但我进入我的文件并在第 114 行向控制台输出了一条消息,但它从未被写入。然后我想它可能正在查看public game() 内的第 117 行,所以我寻找它,它是鼠标事件侦听器的开始。对我来说这是有道理的,这将是 Java 需要权限才能读取的内容,因此我删除了所有内容,然后删除了所有导入以更好地衡量。然后我清除了 Chrome 和 Java 的缓存并重试。同样的错误。

  1. 这是什么意思,我解释错了吗?
  2. 当它说第 117 行时,它是第 117 行的什么?
  3. 为什么会发生这种情况?
  4. 我该如何解决?
  5. 以后如何预防?

供参考,这里是public game()的代码:

public game() throws MalformedURLException{

    JPanel board = new chessboard();
    board.setSize(320, 320);
    board.setLocation(0, 0);

    System.out.println("Got this far");

    Piece wp1 = new Piece(wpawn, a2);
...
    Piece bk = new Piece(bking, e8);


    board.add(wp1);
...
    board.add(bk);

    wp1.setLocation(wp1.square.getPoint());
...     
    bk.setLocation(bk.square.getPoint());

    add(board);
    repaint();

    addMouseListener(new MouseAdapter(){
        public void mousePressed(MouseEvent evt){

            for (int i = 0; i < 8; i++){
                for (int j = 0; j < 8; j++){
                    if (squares[i][j].piece != null)
                        System.out.println(squares[i][j].getPointString() + ": " + squares[i][j].piece.type);
                }
            }

            Point p = evt.getPoint();
            if (0 < p.x && p.x < 319 && 0 < p.y && p.y < 319){
                Square clicked = getSquare(p);
                System.out.println("up: " + clicked.getPointString());
                if (clicked.piece != null){
                    pickedUp = true;
                    pickedUpPiece = clicked.piece;
                }
            }
        }
        public void mouseReleased(MouseEvent evt){
            if (pickedUp){
                Point p = evt.getPoint();
                if (0 < p.x && p.x < 319 && 0 < p.y && p.y < 319){
                    System.out.println("down: " + getSquare(p).getPointString());
                    movePiece(pickedUpPiece, getSquare(p).getColumn(), getSquare(p).getRow());
                }
                pickedUp = false;
            }
            else System.out.println("Not picked up");
        }
    });
}

【问题讨论】:

    标签: java security applet japplet accesscontrolexception


    【解决方案1】:

    堆栈跟踪的关键输出是:

    at java.io.File.getAbsolutePath(File.java:501)
    at game.<init>(game.java:117)
    

    这意味着您的 game.java 文件在第 117 行正在调用 getAbsolutePath()。嵌入在浏览器中的 Java 小程序不允许访问本地文件系统。

    【讨论】:

    • 哇。我的文件在很久很久以前确实有一个 getAbsolutePath 调用,就像我第一次上传它一样。我立即将其删除并重新上传了文件。那怎么还在?从那时起,我已经清除了 Chrome 的缓存和插件数据,并删除了 Java 缓存中的所有内容。几次。如何正确刷新我的小程序?这真是令人沮丧。据我所知,这段时间一切都很好,我一直在努力解决问题。
    • 是的,缓存确实令人沮丧。我会确保你的构建没有错误地进行,你的 jar 文件确实被正确创建,你上传到你的 web 服务器成功,文件在 web 服务器上被替换,并且你的浏览器实际上正在制作200 OK 成功请求您的 jar 文件。
    • 当我在 Eclipse 中运行它时,它工作正常。该文件正在正确替换到服务器。如何检查浏览器是否发出 200 OK 请求?顺便说一句,我一直在做的就是上传类文件,然后拥有一个带有&lt;applet code = "game.class" width = 320 height = 400&gt;&lt;/applet&gt; 的 HTML 文件。还有什么我应该上传的吗?抱歉,我是个新手,我正在看我大学时的 Java 入门书,它只是顺便提到了 Applets。
    • 好吧,再也没有人在浏览器中使用 Java 小程序了(说真的)。要检查您的浏览器是否正在发出请求,请检查您的 Web 服务器日志。您可能会考虑创建一个包含 .class 文件的 .jar 文件,因为一旦您拥有多个文件,您可能需要这样做。
    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多