Pregunta

He reunido un applet básico en el que el usuario selecciona un archivo de su disco duro, lee la primera línea de este archivo y lo pasa a JavaScript para realizar un preprocesamiento adicional, y luego, al hacer clic en un botón, lo intenta. para subir ese archivo a través de una solicitud HTTP POST. Encontré un applet de código abierto muy básico para cargar archivos que he copiado y modificado para este último bit.

El problema es que, sin embargo, no funciona del todo. Parece que está funcionando bien, pero luego me encuentro con dos problemas relacionados con los permisos. Los mensajes en la Consola Java indican que el applet tuvo errores de acceso denegado en los siguientes dos permisos:

java.lang.RuntimePermission setFactory
java.io.FilePermission read

Me parece extraño, porque pensé que ya había otorgado permiso al applet cuando lo construí con el " autofirmado " opción marcada en NetBeans y luego hizo clic para confirmar la pequeña ventana emergente de seguridad en el navegador.

También, la parte que me codifiqué, donde lee el archivo y pasa la primera línea a JavaScript funciona bien. ¡Este es un indicador bastante claro de que el applet puede leer desde el sistema de archivos local! El problema no comienza hasta que realmente intento iniciar la carga. Una cosa a tener en cuenta, supongo, es que el proceso de carga parece ejecutarse en un nuevo subproceso, mientras que el resto se ejecuta en la clase principal sin crear subprocesos.

Soy un principiante total de Java y sé muy poco acerca de los hilos en Java; ¿Necesito pasar los permisos a este nuevo hilo de alguna manera? ¿O algo por el estilo? Gracias de antemano.

¿Fue útil?

Solución

Probablemente necesite pedir permiso al administrador de seguridad (código, no administrador) para realizar una operación privilegiada. Por varias razones, generalmente no es bueno que un applet pueda abrir un archivo local, por lo que está bastante protegido.

La clave básica es llamar a AccessController.doPrivileged () y hay un buen pequeño tutorial en él en las Preguntas frecuentes de Java Ranch.

Otros consejos

Tuve un problema similar que me tomó mucho tiempo resolverlo. Resulta que los métodos de applet llamados desde JavaScript no tienen permisos, incluso si los otorga explícitamente en un archivo de políticas.

Esta solución funcionó para mí (agregar comandos a una cola por la que pasa el applet): http://blog.carrythezero.com/?p=5

Asegúrese de entender los peligros aquí: cualquiera puede modificar JavaScript en una página y cambiar lo que se alimenta en el applet. En mi caso, sé que el código nunca va a estar en un servidor web, y la clase no está firmada, por lo que fallará a menos que se encuentre en la ubicación específica otorgada por mi archivo de políticas.

Probablemente es porque el JavaScript no está firmado. Recomiendo encarecidamente que no firme el código, especialmente si no sabe lo que está haciendo. Desde 6u10 (aún no en Mac), los applets pueden usar JNLP, incluido FileOpenService, por lo que no tiene que firmar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top