java调用javascript简介

一。运用场景:
考虑web登录的安全,在客户端使用javascript对密码进行MD5加密,这样在传输过程中密码就是密文而不是明文。在服务器端要使用同样的MD5加密算法对存储的密码进行处理。这样,同样一个算法要实现两套,不方便维护同一个代码库。
因此,考虑在java端调用javascript。
二。java脚本语言(来自网络)
JDK1.6加入了对Script(JSR223)的支持,JDK5 下需要添加 livetribe-jsr223.jar (未测试)java脚本语言框架提供的主要功能有:
1、使用ScriptEngine标准接口来执行脚本语言(包括代码段、函数、获取返回值等)
该接口是主要的使用接口,可以通过字符串、文件来执行给定的脚本并获取返回值。背后是各个脚本语言引擎的实现
2、使用Binds和ScriptContext提供java和脚本语言间的参数传递(支持命名空间)
对每个脚本引擎而言都有独立的命名空间来进行参数传递,同时也提供全局的命名空间和自定义命名空间。java程序和脚本语言可以通过命名空间相互传递参数
3、提供对脚本语言的编译/解析缓存(如groovy)以提高执行效率
这是针对实现了Compilable接口的引擎而言的,可以用来缓存编译/解析结果以提供重复执行的效率。比如groovy可以将代码编译为java字节码来执行,效率提高是非常明显的。
4、其他功能
其实我们使用前3个主要功能就够了,足可以满足我们在java程序中使用脚本语言的便利。java1.6版的JRE已经自带了javascript脚本语言的实现引擎,采用的是ECMAScript规范的实现Mozilla Rhino。因此,默认我们就可以使用脚本框架在java程序中执行和调用javascript代码了。对于javascript而言,和我们平常在浏览器中使用的基本上都一样,因为都是兼容ECMAScript规范的。有区别的是浏览器中的javascript扩展了可以对DOM对象操作的功能,这是ECMAScript规范中没有的,所以不用指望可以使用类似alert等这样的方言功能了(所有window对象的属性和方法都不可用用的)。
三。参考代码
0。环境
目前在tomcat6.0下出现错误:java.lang.NoClassDefFoundError: javax/script/ScriptException
,在weblogic10上运行正常。
1。web端代码:md5.js可以从网络找
2。服务器端代码:
调用:callMd5("D:/tmp/js/md5.js", "hex_hmac_md5", "bar", "123456");

public static Object callMd5(String funcName, String salt, String pwdhash) throws Exception{

ResourceBundle bundle = ResourceBundle.getBundle("config");
String jsName=bundle.getString("MD5JSFILE");

Object result = null;
String SCRIPT_NAME = "JavaScript";
// Get the JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(SCRIPT_NAME);
if (engine == null) {
throw new ScriptException("Can not initialize "+SCRIPT_NAME+" engine!");
}

/*
* 如果读取javascript文件的时候,没有使用utf-8,那么出现以下错误。
* javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: illegal character (<Unknown source>#1) in <Unknown source> at line number 1
*/
// Run *.js
Reader scriptReader = new InputStreamReader(new FileInputStream(jsName),"utf-8");
try {
engine.eval(scriptReader);
} finally {
if(null!=scriptReader){
scriptReader.close();
scriptReader=null;
}
}

// Invoke a JavaScript function
if (engine instanceof Invocable) {
Invocable invEngine = (Invocable) engine;
result = invEngine.invokeFunction(funcName, salt, pwdhash);
System.out.println("[Java] result: " + result);
//System.out.println(" Java object: " + result.getClass().getName());
} else{
System.out.println("Engine does not support Invocable interface!");
throw new ScriptException("Engine does not support Invocable interface!");
}


return result;

}

3。为了性能,需要使用编译脚本
脚本在每次执行时都进行解析会浪费 CPU 资源。在多次执行相同的脚本时,若能编译脚本,就可以显著减少执行时间,而脚本编译所需要的方法可由另外一个可选接口 javax.script.Compilable 提供,JDK 6 所带的 JavaScript 引擎亦支持该接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值