【问题标题】:Applet method calling from Javascript从 Javascript 调用 Applet 方法
【发布时间】:2015-03-18 20:13:26
【问题描述】:

我有一个小程序可以从特定文件夹上传一些文件并删除它们,但是当我从我的 javascript 代码调用小程序函数时出现问题,当我从 init() 调用该函数时它工作正常。

我的小程序代码:

public class Uploader extends Applet {
   String serverPath;
   String clientPath;
   private JSObject win;
   @Override
   public void init() {
       serverPath = getParameter("serverPath");
       clientPath = getParameter("clientPath");
       try {
           win = JSObject.getWindow(this);
       } catch (JSException e) {
           log.warning("Can't access JSObject object");
       }
       upload(topic,clientPath);
   }
   public void upload(String topic,String clientPath) {
       log.log(Level.SEVERE, "upload functiond");
       DefaultHttpClient client = new DefaultHttpClient();
       MultipartEntity form = new MultipartEntity();
       log.log(Level.SEVERE, "upload functiond2");
       try {
            File directory = new File(clientPath);
            log.log(Level.SEVERE, "upload functiond2.2");
            File[] files = directory.listFiles();
            log.log(Level.SEVERE, "upload functiond2.5");
            int i = 0;
            for (File file : files) {
                log.log(Level.SEVERE, "upload functiond2.6");
                i++;
                form.addPart("file" + String.valueOf(i), new FileBody(file));
                System.out.println("adding file " + String.valueOf(i) + " " + file);
                log.log(Level.SEVERE, "adding file " + String.valueOf(i) + " " + file);
            }
            log.log(Level.SEVERE, "upload functiond3");
            form.addPart("topic", new StringBody(topic, Charset.forName("UTF-8")));
            form.addPart("action", new StringBody(action, Charset.forName("UTF-8")));
            form.addPart("path", new StringBody(serverPath, Charset.forName("UTF-8")));
            HttpPost post = new HttpPost(serverPath);
      ....

这是我的 javascript 代码:

document.applet.upload(title,"c:\scan");

当我从 javascript 调用时,只打印日志:

log.log(Level.SEVERE, "upload functiond2.2");

请注意,当我从 applet 的 init 方法调用时,它工作正常。

我将我的代码包装成PriviligedAction,但只前进了一步并坚持下去

log.log(Level.SEVERE, "upload functiond2.5");

【问题讨论】:

    标签: java javascript security applet


    【解决方案1】:

    Java 和 JS 的交互使安全性复杂化。 JRE 不能信任 JS,因此它决定包含您的代码的整个“操作链”是不受信任的。有办法解决它。

    代码需要包装在PrivilegedAction 中,并使用AccessController methodsdoPrivileged(..) 之一调用。查看AccessController 文档的顶部。 (在方法上方)查看示例用法。

    【讨论】:

    • 当我添加 PrivilagedAction 它进入 log.log(Level.SEVERE, "upload functiond2.5");向前迈出一步,别无其他。你能再帮帮我吗?
    • 我建议你发一个SSCCE。我对... 所暗示的catch 中发生的事情特别感兴趣。确保它包含 e.printStackTrace(); 或类似名称,并在 Java 控制台中获取输出(在此处复制/粘贴)。顺便说一句,这些日志消息中的大多数应该在 Level.INFO 附近
    • 是的,这是一个我看不到的空指针异常,在我的小程序类之前添加注释 @SuppressWarnings("serial") 后,控制台出现异常。谢谢。
    • 忽略异常输出后果自负! ;) 很高兴你把事情解决了。 :)
    • @AndrewThompson 我的问题被你标记为重复(stackoverflow.com/questions/28048078),我来这里是为了感谢你;)我也为我工作。
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 2017-09-11
    • 2012-03-29
    • 1970-01-01
    • 2011-12-28
    • 2010-09-15
    相关资源
    最近更新 更多