【问题标题】:Web Forum Applet works in applet viewer but not in browserWeb 论坛小程序在小程序查看器中有效,但在浏览器中无效
【发布时间】:2014-01-02 03:48:32
【问题描述】:

我一直在研究的嵌入式小程序出现问题。小程序的 jar 已签名并授予所有权限,并且它在小程序查看器中运行良好。在浏览器中加载时,我的小程序应该在的位置只有一个带有错误徽标的空白框。当点击它返回“java.lang.invocationtargetexception”。我正在使用基本的 HTML 格式来嵌入小程序。 这是我用来显示它的 HTML 代码:

<html>
<body background="BG.png">

<a href="index.html">Back to the index</a>

<center><h1>Web Forum</h1></center>
<center><table border = "0">

<tr>
<td><center><h3>Forums</h3></center></td>
<td width = 25></td>
<td width = 225><center><h3>Chatbox</h3></center></td>
</tr>

<tr>
<td><center><applet
code=Topics.class
archive=Topics.jar
width=750
height=1000 ><PARAM name="permissions" value="sandbox"></PARAM>
</applet></center></td>

<td width = 25></td>

<td width = 225 bgcolor = #00FF00><center><h3>Coming Soon</h3></center></td>
</tr>

</table></center>
</Body>
</Html> 

这里是 Java 控制台转储线程列表:

Dump thread list ...
Group main,ac=19,agc=2,pri=10
    main,5,alive
    traceMsgQueueThread,5,alive,daemon
    Timer-0,5,alive
    AWT-Shutdown,5,alive
    AWT-Windows,6,alive,daemon
    Java Plug-In Pipe Worker Thread (Client-Side),5,alive,daemon
    AWT-EventQueue-0,6,alive
    SysExecutionTheadCreator,5,alive,daemon
    MemoryCache-DelayedCleanup,5,alive,daemon
    CacheMemoryCleanUpThread,5,alive,daemon
    Browser Side Object Cleanup Thread,5,alive
    JVM[id=1]-Heartbeat,5,alive,daemon
Group Plugin Thread Group,ac=4,agc=0,pri=10
    AWT-EventQueue-1,6,alive
    Image Fetcher 0,8,alive,daemon
    TimerQueue,5,alive,daemon
    SysExecutionThead,5,alive,daemon
Group http://25.2.202.42/-threadGroup,ac=4,agc=0,pri=4
    Applet 1 LiveConnect Worker Thread,4,alive
    AWT-EventQueue-2,4,alive
    TimerQueue,4,alive,daemon
    ConsoleTraceListener,4,alive,daemon
Done.

这是已签名 jar 的清单:

Manifest-Version: 1.0

Name: .classpath
SHA-256-Digest: IhqMeyTH+t/Wtxr+NP6B1f5GapLwQ67HJhYQ7UM+kA0=

Name: .project
SHA-256-Digest: Lw9C+yAb3p1vC6m2pwcjhv8TB1ET8xOYjM2sFlgIjIw=

Permissions: all-permissions
Codebase: http://25.2.202.42/

我看不出错误是由我的代码本身引起的,但这里只是以防万一:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import java.applet.*;
import java.io.*;


@SuppressWarnings("serial")
public class Topics extends Applet {

String name;
String topics;
String paragraphs;
//reading file for existing posts
String fileread = "Topics.txt";
static String line = null;
{
try {
    FileReader fileReader = 
        new FileReader(fileread);

    BufferedReader bufferedReader = 
        new BufferedReader(fileReader);

    while((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    }   

    bufferedReader.close();         
}
catch(FileNotFoundException ex) {
    System.out.println(
        "Unable to open file '" + 
        fileread + "'");                
}
catch(IOException ex1) {
    System.out.println(
        "Error reading file '" 
        + fileread + "'");                  

}
}
static String display = line;

JPanel topicPanel;
JLabel title, username, topic, paragraph, topicsTitle, dtopicsTitle;
JTextField nameField, topicField;
JButton submitButton, topicrefreshButton;
JTextArea paragraphArea, topicArea;


public void init() {
    final JPanel topicGUI = new JPanel();
    topicGUI.setLayout(null);

    setBackground(Color.GREEN);

    setVisible(true);

    // JLabels

    JLabel title = new JLabel("                                                                           Make A Post                                                                           ");
    title.setSize(150, 25);
    title.setFont(new Font("Serif", Font.PLAIN, 25));
    title.setHorizontalAlignment(0);
    add(title);


    JLabel username = new JLabel("Username: ");
    username.setSize(70, 15);
    username.setHorizontalAlignment(0);
    add(username);

    // JTextField

    nameField = new JTextField(8);
    nameField.setSize(150, 18);
    add(nameField);

    // JLabel

    JLabel topic = new JLabel("Topic: ");
    topic.setSize(40, 15);
    topic.setHorizontalAlignment(0);
    add(topic);

    // JTextField

    topicField = new JTextField(8);
    topicField.setSize(180, 18);
    add(topicField);


    //JLabel

    JLabel paragraph = new JLabel("                                                                                          Paragraph:                                                                                          ");
    paragraph.setSize(70, 15);
    paragraph.setHorizontalAlignment(0);
    add(paragraph);

    // JTextAreas

    paragraphArea = new JTextArea(8, 5);
    paragraphArea.setSize(700, 100);
    paragraphArea.setLineWrap(true);
    paragraphArea.setEditable(true);
    add(paragraphArea);


    // JButton

    JButton submitButton = new JButton("SUBMIT");
    submitButton.setSize(100, 30);
    submitButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            name = nameField.getText();
            topics = topicField.getText();
            paragraphs = paragraphArea.getText();



            display ="\n" + "\t" + name + " - " + "\n" + "\t" + topics + " : " + "\n" + paragraphs + display + "\n";

            topicField.setText("");
            paragraphArea.setText("");

            //writing new info to file
            String fileName = "Topics.txt";

            try {
                FileWriter fileWriter =
                    new FileWriter(fileName);

                BufferedWriter bufferedWriter =
                    new BufferedWriter(fileWriter);

                bufferedWriter.write(display);

                bufferedWriter.close();
            }
            catch(IOException ex) {
                System.out.println(
                    "Error writing to file '"
                    + fileName + "'");
            }
            topicArea.setText(display);
        }
     });


add(submitButton);
JLabel dtopicsTitle = new JLabel("                                                                           Topics:                                                                           ");
dtopicsTitle.setLocation(170, 3);
dtopicsTitle.setSize(150,30);
dtopicsTitle.setFont(new Font("Serif", Font.PLAIN, 25));
dtopicsTitle.setHorizontalAlignment(0);
add(dtopicsTitle);


topicrefreshButton = new JButton("Refresh Topics");
topicrefreshButton.setLocation(250, 30);
topicrefreshButton.setSize(100, 30);
topicrefreshButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {

        topicArea.setText(display);

    }
});
add(topicrefreshButton);    


        topicArea = new JTextArea(40, 64);
        topicArea.setSize(650, 430);
        topicArea.setLineWrap(true);
        topicArea.setEditable(false);
        topicArea.setText(display);
        add(topicArea);
        JScrollPane topicScroll = new JScrollPane(topicArea);
        topicScroll.setSize(650,430);
        add(topicScroll);


}
}

感谢您提供的任何支持。

【问题讨论】:

  • 顺便说一句 - 现在看看“除了代码之外的任何东西”我注意到这个小程序确实是经过签名和信任的。但无论如何都要使用URL
  • 不应该PermissionsCodebase 出现在主要部分而不是它们自己的单独部分中吗? (即将它们向上移动到Manifest-Version,前面没有空行。)

标签: java html file security applet


【解决方案1】:

AppletFile 像油和水一样混合(即“不”)。

不仅任何File 对象不会指向您期望的位置(它们指向用户的本地文件系统,而不是服务器),而且小程序需要经过数字签名和信任才能使用文件。

小程序通常会通过 URL 访问资源。如果 URL 可以相对于小程序的代码库、文档库或类路径形成,则它可以保持沙盒状态并且仍然可以工作。否则它需要被信任。

其他提示

  1. 确保将Java Console 配置为显示小程序和JWS 应用程序。如果默认级别没有输出,请将其提升并重试。
  2. 将表单catch (Exception e) { ..的代码更改为catch (Exception e) { e.printStackTrace(); // very informative! ..
  3. Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。
  4. 不要将 Swing 组件与 AWT 组件混用。 (使用JApplet 而不是Applet。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多