在项目中,有校验规则的验证,甲方想弄成动态的校验规则。在网上查找资料,发现ScriptEngine可以读取动态JS,完美解决该需求。代码如下
package com.bop.web.wjwxxtb.common.util;
import jdk.nashorn.api.scripting.ScriptObjectMirror;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;
import org.apache.commons.collections.map.HashedMap;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class JSEngine {
public static ScriptEngine engine;
//非空验证
public static void callJsFunction2() throws Exception {
engine.eval("function isnull (content) {if(!content){ return false}else{return true} }");
Invocable jsInvoke = (Invocable) engine;
boolean res = (boolean)jsInvoke.invokeFunction("isnull", new Object[] {null});
System.out.println(res);
}
//身份证校验
public static void callJsFunction1() throws Exception {
Map<String,Object> map = new HashedMap();
map.put("cardNo", "485678199506200015");
String ssString = " function IdCodeValid(map){" +
"var code = map.get('cardNo');"+
" var city={11:\"北京\",12:\"天津\",13:\"河北\",14:\"山西\",15:\"内蒙古\",21:\"辽宁\",22:\"吉林\",23:\"黑龙江 \",31:\"上海\",32:\"江苏\",33:\"浙江\",34:\"安徽\",35:\"福建\",36:\"江西\",37:\"山东\",41:\"河南\",42:\"湖北 \",43:\"湖南\",44:\"广东\",45:\"广西\",46:\"海南\",50:\"重庆\",51:\"四川\",52:\"贵州\",53:\"云南\",54:\"西藏 \",61:\"陕西\",62:\"甘肃\",63:\"青海\",64:\"宁夏\",65:\"新疆\",71:\"台湾\",81:\"香港\",82:\"澳门\",91:\"国外 \"};" +
" var row={" +
" 'pass':true," +
" 'flag':1" +
" };" +
" if(!code || !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|[xX])$/.test(code)){" +
" row={" +
" 'pass':false," +
" 'flag':2" +
" };" +
" }else if(!city[code.substr(0,2)]){" +
" row={" +
" 'pass':false," +
" 'flag':2" +
" };" +
" }else{" +
" if(code.length == 18){" +
" code = code.split('');" +
" var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];" +
" var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];" +
" var sum = 0;" +
" var ai = 0;" +
" var wi = 0;" +
" for (var i = 0; i < 17; i++)" +
" {" +
" ai = code[i];" +
" wi = factor[i];" +
" sum += ai * wi;" +
" }" +
" if(parity[sum % 11] != code[17].toUpperCase()){" +
" row={" +
" 'pass':false," +
" 'flag':2" +
" };" +
" }" +
" }" +
" }" +
" return row;" +
" }" +
"";
engine.eval(ssString);
Invocable jsInvoke = (Invocable) engine;
//如果参数固定,可以直接传参
// String codeString = "410012199506200015";
// Object res = jsInvoke.invokeFunction("IdCodeValid", new Object[] { codeString });
// ScriptObjectMirror re1s = (ScriptObjectMirror)jsInvoke.invokeFunction("IdCodeValid", new Object[] { codeString });
// System.out.println(re1s.get("pass"));
//另一种遍历方法,不做推荐
// Collection<Object> vaString = re1s.values();
// Iterator<Object> it = vaString.iterator() ;
// it.forEachRemaining(str -> System.out.println(str));
//参数不固定,选择传map,在js中接收
Map<String,Object> re1s = (Map<String,Object>)jsInvoke.invokeFunction("IdCodeValid", map);
System.out.println(re1s.get("pass"));
}
public static void main(String[] args) throws Exception {
// 获取js引擎实例
ScriptEngineManager sem = new ScriptEngineManager();
engine = sem.getEngineByName("javascript");
callJsFunction1();
}
}