Параметры системы чтения Java-апплета с Sigar API выдает «AccessControlException: доступ запрещен» - PullRequest
3 голосов
/ 15 сентября 2011

Я написал Java-апплет, который проверяет скорость пользовательской ссылки. Я собираю некоторую системную информацию о компьютере пользователя: нагрузку на процессор, количество данных, загружаемых по интерфейсу eth0, и максимальную скорость платы NIC с помощью SIGAR API. Я развернул его на веб-сервере, но когда я пытаюсь запустить его, я получаю следующую информацию об ошибке в консоли Java:

java.lang.reflect.InvocationTargetException
    at java.awt.EventQueue.invokeAndWait(Unknown Source)
    at speedtester_pkg.AppletMain.init(AppletMain.java:80)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ExceptionInInitializerError
    at speedtester_pkg.Test.<init>(Test.java:54)
    at speedtester_pkg.AppletMain.createGUI(AppletMain.java:282)
    at speedtester_pkg.AppletMain$1.run(AppletMain.java:82)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission sigar.nativeLogging 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.checkPropertyAccess(Unknown Source)
    at java.lang.System.getProperty(Unknown Source)
    at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:78)
    ... 17 more

Я не уверен, что это не заблокировано из-за ограничений безопасности апплета, но на форуме пользователей SIGAR (http://forums.hyperic.com/jiveforums/forum.jspa?forumID=2) У меня сложилось впечатление, что его можно использовать с веб-приложениями.

Это мой класс, который использует Sigar API:

    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package speedtester_pkg;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

/**
 *  The logic of the speed test. Starts downloading threads and performs measurements.
 *
 * @author Karol Abramczyk
 */
public class Test implements Runnable{

    private ArrayList <String> urlsValues;
    private URL[] urls;
    private File[] files;
    private int stabilizationTimeSeconds, threadNo, allThreadsNo;
    private boolean continueDownload;
    public AppletMain applet;
    private Sigar sigar;
    private NetInterfaceStat nis;
    private long downloadedDataOld, downloadedDataNew, uploadedDataOld, uploadedDataNew, dataDownloaded,
            downloadingTime;
    private long startTime, stopTime;
    private double speed;
//    private String dir = "D:\\StraTJ_THD\\Abramczyk\\TestySpeedtestera\\";


    /**
     * Creates new instance of the Test object
     * @param gui the calling AppletGUI object
     * @param urlsVal the list of urls to files to download
     * @param time the time of the delay for line stabilization
     */
    public Test(AppletMain applet, ArrayList<String> urlsVal, int time){
        try {
            this.applet = applet;
            this.urlsValues = urlsVal;
            stabilizationTimeSeconds = time;
            allThreadsNo = urlsVal.size();
            AccessController.doPrivileged(new PrivilegedAction()
            { public Object run()
              {
                try {
                    sigar = new Sigar();
                    nis = sigar.getNetInterfaceStat("eth0");
                } catch (SigarException ex) {
                    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                }
                return null;
              }
            });


            urls = new URL[allThreadsNo];
            for (int j = 0; j < allThreadsNo; j++) {
                    urls[j] = new URL(urlsValues.get(j));
            }
        } catch (MalformedURLException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * returns number of bytes downloaded so far
     * @return number of bytes downloaded
     */
    private long getDownloadedDataSize()
    {
        return nis.getRxBytes()*8;
    }

    /**
     * returns number of bytes uploaded so far
     * @return number of bytes uploaded
     */
    private long getUploadedDataSize()
    {
        return nis.getTxBytes()*8;
    }

    /**
     * saves data on the test start: time, downloaded and uploaded number of bytes
     */
    private void getStartData()
    {
        downloadedDataOld = getDownloadedDataSize();
        uploadedDataOld = getUploadedDataSize();
        startTime = System.currentTimeMillis();
        System.out.println(nis.getRxBytes());
        System.out.println(downloadedDataOld);
    }

    /**
     * saves dataon the test stop: time, downloaded and uploaded number of bytes
     */
    private void getStopData()
    {
        stopTime = System.currentTimeMillis();
        downloadedDataNew = getDownloadedDataSize();
        uploadedDataNew = getUploadedDataSize();
    }

    /**
     * starts downloading all the files specified in input file
     * @throws java.io.IOException
     * @throws java.lang.InterruptedException
     */
    public void startDownload() throws IOException, InterruptedException{
        continueDownload = true;

        files = new File[allThreadsNo];
        for (int g = 0; g < allThreadsNo; g++) {
            String name = "speedTest" + g + "_";
            files[g] = File.createTempFile(name, null);
        }

        Thread[] threads = new Thread[allThreadsNo];
        for(int i=0; i<allThreadsNo;i++)
        {
            threadNo = i;
            threads[threadNo] = new Thread(new Download(this, threadNo));
            threads[threadNo].start();
        }

    }

    /**
     * preforms mesurements of speed ralated values as speed, cpu load, nic card speed
     * @throws org.hyperic.sigar.SigarException
     * @throws java.lang.InterruptedException
     */
    private void measure() throws SigarException, InterruptedException {

        measureCPUload();

        measureLinkSpeed();

        System.out.println(dataDownloaded);
        System.out.println(downloadingTime);
        System.out.println(speed);

        measureNICspeed();

    }

    /**
     * measures system CPU load and displays it in applet GUI
     * @throws org.hyperic.sigar.SigarException
     */
    private void measureCPUload() throws SigarException
    {
        CpuPerc cpuPerc = sigar.getCpuPerc();
        applet.setLabelProcessorLoad(CpuPerc.format(cpuPerc.getCombined()));
        applet.setCpuLoad(CpuPerc.format(cpuPerc.getCombined()));
    }

    /**
     * measures link speed as:
     * (number_of_bytes_downloaded_at_the_end - number_of_bytes_downloaded_at_the_beginning)/test_time
     * @throws org.hyperic.sigar.SigarException
     */
    private void measureLinkSpeed() throws SigarException
    {
        nis = sigar.getNetInterfaceStat("eth0");
        getStopData();
        dataDownloaded = downloadedDataNew-downloadedDataOld;
        downloadingTime = (stopTime - startTime)/1000;
        speed = dataDownloaded/downloadingTime;
        applet.setLabelLinkSpeed(formatSpeed(speed));
        applet.setSpeed(formatSpeed(speed));
    }

    /**
     * measures Network Card Interface speed
     * @throws org.hyperic.sigar.SigarException
     */
    private void measureNICspeed() throws SigarException
    {
        nis = sigar.getNetInterfaceStat("eth0");
        long nicSpeed = nis.getSpeed();
        applet.setLabelNIC(formatSpeed(nicSpeed));
        applet.setNICspeed(formatSpeed(nicSpeed));
    }

    /**
     * stops file download
     */
    private void stopDownload()
    {
        continueDownload = false;
    }

    /**
     * formats link speed to more readable format with units. For example "3.54324E7"
     * would be formatted to "35.0 Mb/s"
     * @param speed the link speed
     * @return the more readable link speed with units
     */
    public String formatSpeed(double speed)
    {
        double speedD;
        int speedI;

        if(speed>=1000000)
        {
            speedI = (int)speed/10000;
            speedD = speedI/100;
            return new String(speedD + " Mb/s");
        }
        else if(speed<1000000 && speed>=1000)
        {
            speedI = (int)speed/10;
            speedD = speedI/100;
            return new String(speedD + " Kb/s");
        }
        else
        {
            speedI = (int)speed*100;
            speedD = speedI/100;
            return new String(speedD + " b/s");
        }

    }

    /**
     * starts the test thread
     */
    public void run() {
        try {
            startDownload();
            getStartData();
            System.out.println("Sleep for " + stabilizationTimeSeconds + " seconds");
            Thread.sleep(stabilizationTimeSeconds * 1000);
            System.out.println("Sleep finished");
            measure();
            stopDownload();
            Thread.sleep(1000 * files.length / 2);
            //            removeDownloadedFiles();
        } catch (SigarException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public URL[] getUrls() {
        return urls;
    }

    public boolean isContinueDownload() {
        return continueDownload;
    }

    public File[] getFiles() {
        return files;
    }

    public int getStabilizationTimeSeconds() {
        return stabilizationTimeSeconds;
    }

}

Это мой первый апплет, и я не очень знаком с веб-решениями, поэтому, если кто-нибудь сможет мне помочь, я буду признателен. У меня есть поиск по многим подобным темам, но я не нашел решения. Я пытался использовать метод AccessCOntroller.do Priviliged (), но это не сработало. Я подписал свой JAR-файл классами апплета. Я не уверен, стоит ли мне подписывать эти фляги, не так ли? Мой HTML-файл выглядит следующим образом:

<HTML>
<HEAD>
    <TITLE>Speed Test</TITLE>
</HEAD>
<BODY>


<P>
<APPLET 
    code="speedtester_pkg.AppletMain" 
    archive="SpeedTester.jar,activation.jar,mail.jar,mailapi.jar,sigar.jar,smtp.jar" 
    width=440     
    height=600>
</APPLET>
</P>

</BODY>
</HTML>

1 Ответ

3 голосов
/ 15 сентября 2011

Апплет нужно доверять, чтобы делать определенные вещи.Чтобы быть доверенным, апплет (и другие зависимые файлы JAR) должен иметь:

  1. с цифровой подписью (с использованием действующего сертификата подписи кода) от разработчика.
  2. OK'd конечным пользователем при появлении запроса.Как правило, стоит заранее предупредить пользователя о том, что от него требуется («нажмите OK при появлении запроса») и почему («чтобы апплет мог работать»), прежде чем бросить ему приглашение в лицо.
...