Java调用某一js文件中的方法,执行并返回结果

Java 调用某一 js 文件中的方法,获得执行结果

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;


/**
     * 调用js文件中的某一函数,处理数据
     * 
     * @param code 需要处理的数据
     * @param JsURL js文件的url  
     * @param functionName 调用的js文件中的函数名
     *        
     * @return newCode   被js文件中的函数处理后的新的数据
     * */
    public static String processDataViaJs(String code ,String JsURL,String functionName ) throws Exception {
        ScriptEngineManager manager = new ScriptEngineManager();
        String newCode = "";
        InputStreamReader inputStreamReader = null;
        ScriptEngine engine = manager.getEngineByName("javascript");
        try {
            URL url = new URL(JsURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "text/html");
            inputStreamReader = getInputContent("GET", null, conn);//获取js内容
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        engine.eval(inputStreamReader);
        if (engine instanceof Invocable) {
            Invocable invoke = (Invocable) engine; 
            newCode = (String) invoke.invokeFunction(functionName, code);// 调用对应方法,并传入
                                                                         //1个参数:需要处理的 字符串符串

       }
        inputStreamReader.close();
        return newCode;
    }
/**
 *
 *    通过流获取返回内容
 */
private static InputStreamReader getInputContent(String requestMethod,
        String outputStr, HttpURLConnection conn) throws ProtocolException,
    IOException, UnsupportedEncodingException { // (封装的http请求方法) 需要调用的方法
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        // 设置请求方式(GET/POST)
        conn.setRequestMethod(requestMethod);
        // 当outputStr不为null时向输出流写数据
        if (null != outputStr) {
            OutputStream outputStream = conn.getOutputStream();
            // 注意编码格式
            outputStream.write(outputStr.getBytes("UTF-8"));
            outputStream.close();
        }
        // 从输入流读取返回内容
        InputStream inputStream = conn.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(
            inputStream, "UTF-8");
        return inputStreamReader;
    }

例子:
下面说一个我在实际开发中遇到的例子,在做模拟登陆时,某网站需要进行对姓名,密码,验证码等的加密,加密后的数据作为参数才能进行登录。而加密方法写在某一js文件中,现需要调用该发方法处理需要加密的字符串。具体如下所示:

注:具体url的ip部分已用*代替,涉及到隐私,不影响阅读

/**
     * 执行md5.js文件中的MD5函数
     * 
     * @param code
     *            原始字符串
     * @return 进行加密操作后的字符串
     * */
    public static String md5Special(String code) throws Exception {
        ScriptEngineManager manager = new ScriptEngineManager();
        String newCode = "";
        InputStreamReader inputStreamReader = null;
        ScriptEngine engine = manager.getEngineByName("javascript");
        try {
            URL url = new URL("http://211.***.***.193/*****/js/md5.js");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "text/html");
            inputStreamReader = getInputContent("GET", null, conn);
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        engine.eval(inputStreamReader);
        if (engine instanceof Invocable) {
            Invocable invoke = (Invocable) engine; 
            newCode = (String) invoke.invokeFunction("md5", code);// 调用md5方法,并传入1个参数


        }
          inputStreamReader.close();
          return newCode;

    }
    /**
 *
 *    通过流获取返回内容
 */
private static InputStreamReader getInputContent(String requestMethod,
        String outputStr, HttpURLConnection conn) throws ProtocolException,
    IOException, UnsupportedEncodingException { // (封装的http请求方法) 需要调用的方法
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        // 设置请求方式(GET/POST)
        conn.setRequestMethod(requestMethod);
        // 当outputStr不为null时向输出流写数据
        if (null != outputStr) {
            OutputStream outputStream = conn.getOutputStream();
            // 注意编码格式
            outputStream.write(outputStr.getBytes("UTF-8"));
            outputStream.close();
        }
        // 从输入流读取返回内容
        InputStream inputStream = conn.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(
            inputStream, "UTF-8");
        return inputStreamReader;
    }

你可能感兴趣的:(---------【Java】,◆编程语言)