Applet访问本地文件,只需要用私有签名即可搞定。但用JS去调用相同的方法,却返回下面错误:
Exception in thread "Thread-14" java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\TEMP" "read") at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkRead(Unknown Source) at java.io.File.exists(Unknown Source) ......
主要是JS本身不被允许调用本地文件,从而JS调用的Applet方法也就没有权限去做访问本地文件这样的方法了。
为了解决这个问题:
首先,要用Manifest进行权限设置:
Manifest-Version: 1.0 Application-Name: AppletTest Implementation-version: 1.0 Permissions: all-permissions Caller-Allowable-Codebase: * localhost 127.0.0.1 Application-Library-Allowable-Codebase: *
然后,一般来说有两个方案来解决这个问题:
1、通过JS解决:
A、不要直接调用Applet的方法
B、而是用JS操作DOM,生成新的Applet的Tag
C、这样Applet可以在此从init进入,从而获得新的权限,儿不是JS的权限
2、通过AccessController.doPrivileged获取权限来解决:
public String readFile() { final TestContent content = new TestContent(); AccessController.doPrivileged(new PrivilegedAction() { public Object run() { content.text = readFileByLines("test.txt"); return null; } }); return content.text; }