从ColdFusion调用.jar并在客户端计算机上运行

时间:2018-07-14 09:26:28

标签: java coldfusion coldfusion-11

我正在使用ColdFusion 11,并且我的类路径中有一个eSignWeb.jar文件(显然是用Java创建的)。该.jar的作用是接收客户端计算机上文件的路径,然后使用Bouncy Castle分析该文件。

但是当我运行它时,出现以下错误:

  

代码:java.io.FileNotFoundException:   C:\ Users \ name \ Documents \ clientfile.cer(系统找不到   指定的路径)

错误是因为我的.jar文件试图在服务器而不是客户端计算机上查找clientfile.cer文件。我需要的是,在服务器上运行的该.jar可以在客户端计算机上搜索该文件。电脑。

重要:

  1. clientfile.cer文件永远无法上传到服务器,因此必须在客户端进行分析。
  2. 我必须在Java中使用ColdFusion

我在ColdFusion中的代码很简单:

<cfset eSign = createObject("java","eSignWeb.SignAB") />
<cfoutput>
    <!--- TEST1--->
    <cfdump var="#eSign#">
    #eSign.callsignCF()#
    <hr />
    <!--- TEST2 WITH cfscript --->
    <cfscript>
        classLoader = createObject("java","eSignWeb.SignAB");
        response = classLoader.callsignCF();
        WriteOutput("Test whith CFSCRIPT " & response); 
    </cfscript>
</cfoutput>

.jar文件中的代码:

package eSignWeb;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Date;
import javax.naming.InvalidNameException;
import javax.naming.ldap.LdapName;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class SignAB {
    public String callsignCF(){

        String vCer;

        vCer = "C:\\Users\\name\\Documents\\clientfile.cer"; //Path where the .cer file is located on the client side

        Security.addProvider(new BouncyCastleProvider()); // add bc as provider

        String archivoCer;
        X509Certificate certificado = null;
        Date fechaFinal;
        Date fechaInicial;
        Date fechaActual;

        //start cer
        archivoCer = vCer;

        try {
        FileInputStream is = new FileInputStream(archivoCer);

            try {

                CertificateFactory cf = CertificateFactory.getInstance("X.509");
                certificado = (X509Certificate)cf.generateCertificate(is);

                fechaFinal = certificado.getNotAfter();
                fechaInicial = certificado.getNotBefore();
                fechaActual = new Date();

                if(fechaActual.before(fechaInicial) && fechaActual.after(fechaFinal)){
                    return "Invalid date";                     
                }else{
                    String myVarConRFC = "2.5.4.45";

                    String dn = certificado.getSubjectX500Principal().getName();
                    LdapName ldapDN = new LdapName(dn);

                    ldapDN.getRdns().forEach((index) -> {

                        if(index.getType().equals(myVarConRFC)){
                            //RFC
                            String myRFC = new String((byte[]) index.getValue()); 
                        }
                    });
                }
            } 

            catch (InvalidNameException ex) {
                return "E0: Error on cer. Code: "+ ex;
            } 

            catch(CertificateException a) { 
                    return "E1: The specified file is not a valid certificate file. Code: " +a;

            }  

        }
        catch(FileNotFoundException fnfe) {  
            return "E2: Certificate file does not exist. Code: " +fnfe;
        } 
        // End cer

        return "Unknown error";   
    }
}

如您所见,.jar在服务器上运行,这就是为什么它找不到.cer文件的原因。关于如何获得允许.jar在客户端计算机上搜索文件的功能的任何想法?

如果我可以将.cer文件上传到服务器,那将非常容易,但这是禁止的。 .cer文件永远不要离开客户端计算机。

非常感谢您提供这方面的指导!

1 个答案:

答案 0 :(得分:0)

仅CF不能用于此类任务,因为它仅在CF服务器上运行。它根本无法访问客户端文件。仅将文件上传到服务器或服务器可访问的位置(您说不能这样做)。

为了访问客户端计算机上的文件,您需要运行在客户端上的 signed Java AppletWeb Start Application之类的东西。 “签名”部分很重要。出于安全原因,小程序等无法随心所欲地访问客户端计算机上的文件。用户必须明确授予Applet或Web Start应用程序权限。