ScriptEngine读取动态JS

在项目中,有校验规则的验证,甲方想弄成动态的校验规则。在网上查找资料,发现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();
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值