java,javascript签名的小程序(文件选择,ftp上传)安全性/套接字异常

java, javascript signed applet (file choosing, ftp upload) security/socket exception

本文关键字:上传 ftp 安全性 异常 套接字 选择 javascript java 程序 文件      更新时间:2023-09-26

我有一个java小程序,它使用了一个包含3个函数(不包括测试函数)的类:

  • 一个用于运行文件选择器并将选定的文件(类型为FileContents)添加到数组中
  • 第二步是在必要时从数组中删除一些文件
  • 第三个是将文件上传到ftp服务器。

    所有这些都是从Javascript代码调用的。前两个函数运行良好。上传功能不工作,它抛出:

java.security.AccessControlException:访问被拒绝("java.net.SocketPermission"(dest.ftp服务器)"resolve")

小程序是自签名的。我正在使用[Yii Framework][1]
重要代码:-上传器上传功能:

public void upload( String ftpServer, String username, String password, String filePath )
throws MalformedURLException, IOException
{
    if ( ftpServer != null && filePath != null && this.filesArray.length > 1 ) {
        StringBuffer sb = new StringBuffer( "ftp://" );
        //check for authentication, if username and password not provided assume annonymous access
        if ( username != null && password != null ) {
            sb.append( username );
            sb.append( ':' );
            sb.append( password );
            sb.append( '@' );
        }
        sb.append( ftpServer );
        sb.append( ":21" );
        sb.append( '/' );
        if ( !filePath.equals( "" ) ) {
            sb.append( filePath );
            sb.append( '/' );
        }
        StringBuffer sb2 = new StringBuffer( sb.toString() );
        //below: i < this.filesArray.length - 1 becouse last field is always empty
        for ( int i = 0; i < this.filesArray.length - 1; i++ ){ 
            sb.append( this.filesArray[ i ].getName() );
            sb.append( ";type=i" );
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            try {
                URL url = new URL( sb.toString() );
                URLConnection urlConn = url.openConnection();
                bos = new BufferedOutputStream( urlConn.getOutputStream() );
                bis = new BufferedInputStream( this.filesArray[ i ].getInputStream() );
                int j;
                //read byte by byte until end of stream
                while ( ( j = bis.read() ) != -1 ) {
                    bos.write( j );
                }
            }
            finally {
                if ( bis != null ) {
                    try {
                        bis.close();
                    }
                    catch( IOException ioe ) {
                        ioe.printStackTrace();
                    }
                }
                if ( bos != null ) {
                    try {
                        bos.close();
                    }
                    catch ( IOException ioe ) {
                        ioe.printStackTrace();
                    }
                }
            }
            sb = sb2;
        }
    }
    else {
        System.out.println( "Ftp address incorrect or input file not available." );
    }
}

部署代码

    <script>
var attributes = { id:'uploader1Applet',
    code: 'filesUpload.uploaderApplet',
    archive:'<?php echo Yii::app()->getBaseUrl(true); ?>/java/uploaderApplet.jar',  width:1, height:1} ;

var parameters = {jnlp_href: '<?php echo Yii::app()->getBaseUrl(true);?>/java/upload-applet.jnlp'};   

     deployJava.runApplet(attributes, parameters, '1.6') ;

  • javascript声明+初始化(仅初始化作业是将新的FileContents数组分配给Uploader属性;与上面的视图相同,不同的脚本):
var uploader = document.getElementById( 'uploader1Applet' ).getUploader();
      uploader.initialize();
  • 上传方法调用(与Uploader声明+初始化相同的脚本):

uploader.upload(connAddress,connUsername,'<?php echoYii::app()->session['ftpPassword'];?>',connRootFolder!=无效的connRootFolder:");

有什么办法解决我的问题吗?

从Javascript调用的Java方法通常需要封装在AccessController.doPrivileged(..)调用中才能被信任。