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

来源:互联网 发布:种族歧视知乎 编辑:程序博客网 时间:2024/06/07 02:01

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;    }
1 0
原创粉丝点击