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;
}