Error al ejecutar un applet en el navegador.Acceso denegado
ERROR: Acceso denegado al ejecutar un applet en el navegador.
He construido un applet que llama a una clase perteneciente a un
reproductor de ficheros PCM (WAV). Tengo una p谩gina html que llama
al applet de la siguiente forma:
<HTML>
<HEAD>
<TITLE> Reproductor de ficheros PCM </TITLE>
</HEAD>
<BODY>
Salida del programa:
<APPLET CODE="ReproductorApplet.class"
WIDTH=300 HEIGHT=100
ALT = "Applet: REPRODUCTOR DE AUDIO"
CODEBASE = "http://localhost:8080/Reproductor">
<PARAM NAME="fichero" VALUE="http://localhost:8080/Reproductor/Applause.wav">
</APPLET>
</BODY>
</HTML>
El fichero java del applet es el siguiente
import javax.swing.JApplet;
public class ReproductorApplet extends JApplet {
static ReproductorApplet applet;
private ReproductorAudio02 player;
private String param;
public void init(){
applet = this;
param = null;
param = getParameter("fichero");
}
public void start(){
getContentPane().add("Center",
player = new ReproductorAudio02(param));
}
public void stop(){
}
public void destroy(){
}
}//fin ReproductorApplet
El fichero java del reproductor es el siguiente:
/*
Fichero: ReproductorAudio02.java
Descripci贸n: Reproduce un fichero de audio especificado
por el usuario mediante paso por par谩metros
Se dispone de una interfaz de usuario formada por los
siguientes componentes:
Bot贸n Play: Reproduce el fichero de audio
Bot贸n Stop: para la reproducci贸n del fichero.
Una vez que se est谩 en elprograma se puede pulsar
el bot贸n Play para reproducir el fichero de audio.
Si se pulsa el bot贸n Stop durante la reproducci贸n del
fichero, entonces se detiene la reproducci贸n del fichero
de audio. Hay un cierto retardo entre la pulsaci贸n del bot贸n
Stop y la detenci贸n de la reproducci贸n.
El programa muestra el formato de los datos del fichero
de audio antes de reproducirse el fichero. El formato de los
datos se muestra por la pantalla de l铆nea de comandos.
Probado utilizando Java 2 SDK 1.4.1.01 en Windows 98
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;
import java.lang.*;
public class ReproductorAudio02 extends JFrame{
String FAudio;
AudioFormat audioFormat;
AudioInputStream audioInputStream;
SourceDataLine sourceDataLine;
boolean PararReproduccion = false;
final JButton BotonStop = new JButton("Parar");
final JButton BotonPlay = new JButton("Reproducir");
public static void main(String args[]){
if (args.length!=1)
System.out.println("Sintaxis incorrecta: Java ReproductorAudio01 ficheroPCM");
else{
new ReproductorAudio02(args[0]);
}
}//fin main
//-------------------------------------------//
public ReproductorAudio02(String FichAudio){//constructor
FAudio = FichAudio;
BotonStop.setEnabled(false);
BotonPlay.setEnabled(true);
//Instanciar y registrar los action listeners
//en los botones Reproducir y Parar
//Bot贸n Reproducir
BotonPlay.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
BotonStop.setEnabled(true);
BotonPlay.setEnabled(false);
Reproducir(FAudio);//Reproducir el fichero
}//fin actionPerformed
}//fin ActionListener
);//fin addActionListener()
//Bot贸n Parar
BotonStop.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
//Terminar reproducci贸n despu茅s de EOF
PararReproduccion = true;
}//fin actionPerformed
}//fin ActionListener
);//fin addActionListener()
//A帽adir los botones y el campo de texto al panel
getContentPane().add(BotonPlay,"West");
getContentPane().add(BotonStop,"East");
//Poner el t铆tulo
setTitle("Reproductor de Audio");
//Establecer la acci贸n por defecto al cerrar
setDefaultCloseOperation(EXIT_ON_CLOSE);
//Establecer el tama帽o
setSize(250,50);
//Hacer visible el reproductor
setVisible(true);
}//end constructor
//-------------------------------------------//
//Este m茅todo reproduce los datos de audio desde
//el fichero indicado por el campo de texto
private void Reproducir(String FichAudio) {
try{
//Crear una instaciaci贸n al fichero de audio
//indicado en el campo de texto
File FicheroAudio = new File(FichAudio);
//Crear el flujo de entrada del fichero de audio
audioInputStream = AudioSystem.getAudioInputStream(FicheroAudio);
//Tomar el formato del audio del flujo
audioFormat = audioInputStream.getFormat();
//Imprimir por pantalla el formato del fichero de audio
//que se va a reproducir.
System.out.println(audioFormat);
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,audioFormat);
sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);
//Crear un hilo para reproducir los datos e inicializar
//la ejecuci贸n. Se reproducir谩 audio mientras no se
//llegue al fin de fichero o no se pulse el bot贸n de Stop
//Debido a la utilizaci贸n de buffers, normalmente se
//producir谩 un retardo entre la pulsaci贸n del bot贸n de Stop
//y la detenci贸n de la reproducci贸n
new HiloReproducir().start();
}catch (Exception e) {
e.printStackTrace();
System.exit(0);
}//end catch
}//end Reproducir
//=============================================//
//Clase para reproducir los datos de audio del fichero
class HiloReproducir extends Thread{
//buffer temporal para los datos de audio
byte tempBuffer[] = new byte[10000];
public void run(){
try{
sourceDataLine.open(audioFormat);
sourceDataLine.start();
int cnt;
//Mientras el m茅todo read no devuelva -1 o
//no se pulse el bot贸n de Stop
while((cnt = audioInputStream.read(
tempBuffer,0,tempBuffer.length)) != -1
&& PararReproduccion == false){
if(cnt > 0){
//Escribir los datos al buffer que
//ser谩 mandado a los altavoces
sourceDataLine.write(tempBuffer, 0, cnt);
}//if
}//while
//Bloquearse y esperar hasta que el buffer
//interno se vac铆e
sourceDataLine.drain();
sourceDataLine.close();
//Prepare to playback another file
//Preparar la reproducci贸n de otro fichero
BotonStop.setEnabled(false);
BotonPlay.setEnabled(true);
PararReproduccion = false;
}catch (Exception e) {
e.printStackTrace();
System.exit(0);
}//catch
}//run
}//class HiloReproducir
//===================================//
}//class Reproductor.java
Cuando llamo desde el navegador IExplore al fichero Reproductor.htm
http://localhost:8080/Reproductor/Reproductor.htm la consola de Java
muestra el siguiente error.
java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:270)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:542)
at java.lang.SecurityManager.checkExit(SecurityManager.java:762)
at javax.swing.JFrame.setDefaultCloseOperation(JFrame.java:356)
at ReproductorAudio02.<init>(ReproductorAudio02.java:93)
at ReproductorApplet.start(ReproductorApplet.java:13)
at sun.applet.AppletPanel.run(AppletPanel.java:370)
at java.lang.Thread.run(Thread.java:536)
Alguien podr铆a decirme que permiso o permisos deber铆a asignar al fichero
java.policy o si deber铆a crear otro fichero de pol铆tica independiente.
En caso de crear un nuevo fichero de pol铆tica, donde deber铆a guardarlo
en el disco duro del servidor? Estoy utilizando Windows XP con Tomcat 4.1
He construido un applet que llama a una clase perteneciente a un
reproductor de ficheros PCM (WAV). Tengo una p谩gina html que llama
al applet de la siguiente forma:
<HTML>
<HEAD>
<TITLE> Reproductor de ficheros PCM </TITLE>
</HEAD>
<BODY>
Salida del programa:
<APPLET CODE="ReproductorApplet.class"
WIDTH=300 HEIGHT=100
ALT = "Applet: REPRODUCTOR DE AUDIO"
CODEBASE = "http://localhost:8080/Reproductor">
<PARAM NAME="fichero" VALUE="http://localhost:8080/Reproductor/Applause.wav">
</APPLET>
</BODY>
</HTML>
El fichero java del applet es el siguiente
import javax.swing.JApplet;
public class ReproductorApplet extends JApplet {
static ReproductorApplet applet;
private ReproductorAudio02 player;
private String param;
public void init(){
applet = this;
param = null;
param = getParameter("fichero");
}
public void start(){
getContentPane().add("Center",
player = new ReproductorAudio02(param));
}
public void stop(){
}
public void destroy(){
}
}//fin ReproductorApplet
El fichero java del reproductor es el siguiente:
/*
Fichero: ReproductorAudio02.java
Descripci贸n: Reproduce un fichero de audio especificado
por el usuario mediante paso por par谩metros
Se dispone de una interfaz de usuario formada por los
siguientes componentes:
Bot贸n Play: Reproduce el fichero de audio
Bot贸n Stop: para la reproducci贸n del fichero.
Una vez que se est谩 en elprograma se puede pulsar
el bot贸n Play para reproducir el fichero de audio.
Si se pulsa el bot贸n Stop durante la reproducci贸n del
fichero, entonces se detiene la reproducci贸n del fichero
de audio. Hay un cierto retardo entre la pulsaci贸n del bot贸n
Stop y la detenci贸n de la reproducci贸n.
El programa muestra el formato de los datos del fichero
de audio antes de reproducirse el fichero. El formato de los
datos se muestra por la pantalla de l铆nea de comandos.
Probado utilizando Java 2 SDK 1.4.1.01 en Windows 98
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;
import java.lang.*;
public class ReproductorAudio02 extends JFrame{
String FAudio;
AudioFormat audioFormat;
AudioInputStream audioInputStream;
SourceDataLine sourceDataLine;
boolean PararReproduccion = false;
final JButton BotonStop = new JButton("Parar");
final JButton BotonPlay = new JButton("Reproducir");
public static void main(String args[]){
if (args.length!=1)
System.out.println("Sintaxis incorrecta: Java ReproductorAudio01 ficheroPCM");
else{
new ReproductorAudio02(args[0]);
}
}//fin main
//-------------------------------------------//
public ReproductorAudio02(String FichAudio){//constructor
FAudio = FichAudio;
BotonStop.setEnabled(false);
BotonPlay.setEnabled(true);
//Instanciar y registrar los action listeners
//en los botones Reproducir y Parar
//Bot贸n Reproducir
BotonPlay.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
BotonStop.setEnabled(true);
BotonPlay.setEnabled(false);
Reproducir(FAudio);//Reproducir el fichero
}//fin actionPerformed
}//fin ActionListener
);//fin addActionListener()
//Bot贸n Parar
BotonStop.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
//Terminar reproducci贸n despu茅s de EOF
PararReproduccion = true;
}//fin actionPerformed
}//fin ActionListener
);//fin addActionListener()
//A帽adir los botones y el campo de texto al panel
getContentPane().add(BotonPlay,"West");
getContentPane().add(BotonStop,"East");
//Poner el t铆tulo
setTitle("Reproductor de Audio");
//Establecer la acci贸n por defecto al cerrar
setDefaultCloseOperation(EXIT_ON_CLOSE);
//Establecer el tama帽o
setSize(250,50);
//Hacer visible el reproductor
setVisible(true);
}//end constructor
//-------------------------------------------//
//Este m茅todo reproduce los datos de audio desde
//el fichero indicado por el campo de texto
private void Reproducir(String FichAudio) {
try{
//Crear una instaciaci贸n al fichero de audio
//indicado en el campo de texto
File FicheroAudio = new File(FichAudio);
//Crear el flujo de entrada del fichero de audio
audioInputStream = AudioSystem.getAudioInputStream(FicheroAudio);
//Tomar el formato del audio del flujo
audioFormat = audioInputStream.getFormat();
//Imprimir por pantalla el formato del fichero de audio
//que se va a reproducir.
System.out.println(audioFormat);
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,audioFormat);
sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);
//Crear un hilo para reproducir los datos e inicializar
//la ejecuci贸n. Se reproducir谩 audio mientras no se
//llegue al fin de fichero o no se pulse el bot贸n de Stop
//Debido a la utilizaci贸n de buffers, normalmente se
//producir谩 un retardo entre la pulsaci贸n del bot贸n de Stop
//y la detenci贸n de la reproducci贸n
new HiloReproducir().start();
}catch (Exception e) {
e.printStackTrace();
System.exit(0);
}//end catch
}//end Reproducir
//=============================================//
//Clase para reproducir los datos de audio del fichero
class HiloReproducir extends Thread{
//buffer temporal para los datos de audio
byte tempBuffer[] = new byte[10000];
public void run(){
try{
sourceDataLine.open(audioFormat);
sourceDataLine.start();
int cnt;
//Mientras el m茅todo read no devuelva -1 o
//no se pulse el bot贸n de Stop
while((cnt = audioInputStream.read(
tempBuffer,0,tempBuffer.length)) != -1
&& PararReproduccion == false){
if(cnt > 0){
//Escribir los datos al buffer que
//ser谩 mandado a los altavoces
sourceDataLine.write(tempBuffer, 0, cnt);
}//if
}//while
//Bloquearse y esperar hasta que el buffer
//interno se vac铆e
sourceDataLine.drain();
sourceDataLine.close();
//Prepare to playback another file
//Preparar la reproducci贸n de otro fichero
BotonStop.setEnabled(false);
BotonPlay.setEnabled(true);
PararReproduccion = false;
}catch (Exception e) {
e.printStackTrace();
System.exit(0);
}//catch
}//run
}//class HiloReproducir
//===================================//
}//class Reproductor.java
Cuando llamo desde el navegador IExplore al fichero Reproductor.htm
http://localhost:8080/Reproductor/Reproductor.htm la consola de Java
muestra el siguiente error.
java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:270)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:542)
at java.lang.SecurityManager.checkExit(SecurityManager.java:762)
at javax.swing.JFrame.setDefaultCloseOperation(JFrame.java:356)
at ReproductorAudio02.<init>(ReproductorAudio02.java:93)
at ReproductorApplet.start(ReproductorApplet.java:13)
at sun.applet.AppletPanel.run(AppletPanel.java:370)
at java.lang.Thread.run(Thread.java:536)
Alguien podr铆a decirme que permiso o permisos deber铆a asignar al fichero
java.policy o si deber铆a crear otro fichero de pol铆tica independiente.
En caso de crear un nuevo fichero de pol铆tica, donde deber铆a guardarlo
en el disco duro del servidor? Estoy utilizando Windows XP con Tomcat 4.1
