Why is my applet throwing an AccessControlException?
Asked Answered
E

1

1

I am trying to build a Java applet, called game, which is something I have never done before (I've always just built standalone applications). My applet works fine when I test it in Eclipse, but when I try putting it on my website, I get the following error in the console:

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

It says access denied (java.util.PropertyPermission user.dir read), but I can't figure out where it's trying to read something off the user's file system.

It also says at game.<init>(game.java:117), but I went into my file and made a message output to the console on line 114 and it never got written. I then figured that maybe it was looking at line 117 inside public game(), so I looked for that and it was the start of a listener for a Mouse event. It made sense to me that this would be something that Java would need permission to read, so I deleted all of it and then deleted all the imports for good measure. Then I cleared both Chrome and Java's caches and retried. Same error.

  1. What does this mean, am I interpreting it incorrectly?
  2. When it says that line 117, what is it line 117 of?
  3. Why would this be happening?
  4. How can I fix it?
  5. How can I prevent it in the future?

For reference, here is the code for 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");
        }
    });
}
Embonpoint answered 12/5, 2012 at 23:59 Comment(0)
R
3

The key output of the stack trace is:

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

This means that your game.java file, at line 117, is calling getAbsolutePath() on something. Java applets embedded in a browser are not permitted to access the local filesystem.

Reavis answered 13/5, 2012 at 0:3 Comment(4)
Wow. My file did have a getAbsolutePath call a very, very long time ago, as in the first time I uploaded it. I deleted it immediately and re-uploaded the file. How is that still there? I've cleared Chrome's cache and plug-in data and deleted everything in the Java cache since then. Several times. How can I refresh my applet properly? This is really frustrating. For all I know, everything has been alright this entire time and I've been fighting a non-problem.Embonpoint
Yeah, caching can be really frustrating. I'd make sure that your build is proceeding without error, that your jar file really is being created properly, that your upload to your web server succeeds, that the file gets replaced on the web server, and that your browser is actually making a 200 OK successful request for your jar file.Reavis
When I run it in Eclipse, it works alright. The file is being replaced correctly to the server. How can I check that the browser makes a 200 OK request? Incidentally, all I have been doing is uploading the class files and then having an HTML file with <applet code = "game.class" width = 320 height = 400></applet>. Is there something else I should be uploading? Sorry for being a total newb at this, I'm going by my Intro Java book from college, which only really mentions Applets in passing.Embonpoint
Well, nobody uses Java applets in a browser anymore (seriously). To check that your browser is making a request, check your web server logs. You might consider creating a .jar file that contains your .class files, because once you have more than one you'll probably need to do that.Reavis

© 2022 - 2024 — McMap. All rights reserved.