Java执行js加密算法
Java执行js加密算法
今日需求:在后端执行一段加密算法,算法是js写的
明白需求以后疯狂百度。最后发现JDK提供了各种脚本的支持(怪笔者学艺不精,第一次见识到这个库,留下不学无术的泪水),正题开始,Java如何执行一段加密算法呢?
java对脚本的支持全部存放于javax.script包下
接口:
Bindlings
Compilable
Invocable
ScriptContext
ScriptEngine
ScriptEngineFactory
类:
AbstractScriptEngine
CompiledScript
ScriptEngineManager
SimpleBindings
SimpleScriptContext
异常:
ScriptException
我们本次使用到的有ScriptEngineManager,ScriptEngine,Invocable
ScriptEngineManager为ScriptEngine类实现一个发现和实例化机制,还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态。此类使用[服务提供者](../../../technotes/guides/jar/jar.html#Service Provider)机制枚举所有的ScriptEngineFactory实现。
ScriptEngineManager提供了一个方法,可以返回一个所有工厂实现和基于语言名称、文件扩展名和 mime 类型查找工厂的实用方法所组成的数组。键/值对的
Bindings(即由管理器维护的 "Global Scope")对于ScriptEngineManager创建的所有ScriptEngine实例都是可用的。Bindings中的值通常公开于所有脚本中。 JDK官方解释
我们通过ScriptEngineManager获取指定脚本语言的执行引擎(ScriptEngine),然后调用eval()执行脚本代码,再加该脚本引擎转换为Invocable接口,该接口由NashornScriptEngine实现,并且这个实现类中定义了invokeFunction方法来执行这段代码。同时它也定义了getInterface方法来将js代码作为传入接口的实现,来调用这个方法。
public static String playJS(String str){
//获取脚本引擎管理器
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
//获取指定脚本的引擎管理器
ScriptEngine js = scriptEngineManager.getEngineByName("js");
//conwork.js文件是一个js的加密算法
InputStream resource = PlayJS.class.getClassLoader().getResourceAsStream("conwork.js");
try {
Reader reader = new BufferedReader(new InputStreamReader(resource,"utf-8"));
//执行脚本
js.eval(reader);
if(js instanceof Invocable){
//将脚本引擎转换Invocable
Invocable invocable = (Invocable) js;
// 将js代码转换为该接口的实现,Method是自定义的接口,用来存放加密算法
Methods executeMethod = invocable.getInterface(Methods.class);
// 执行指定的js方法
return executeMethod.encodeInp(str);
}
} catch (ScriptException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null ;
}
Methods接口
public interface Methods {
public String encodeInp(String input);
}
此时,调用playJS方法传入的数据,就是加密以后的数据
接下来玩一个更好玩的,JavaScript代码中执行Java代码
- 定义一个静态方法
static String fun1(String name){
System.out.format("this is java code , %s"+name);
return "thank you";
}
- 在JavaScript代码中导入类
//通过Java.type(),这个代码相当于Java代码的import导入类
var myTestClass = Java.ype("com.bywlstuido.MyTestClass");
//有了Java类的原型,就可以调用类中的静态方法了
var result = myTestClass.fun1("JS invoke");
print(result);
//this is java code ,JS invoke
//thank you
执行完毕
Java执行js加密算法的更多相关文章
- Java执行js代码
在做项目中有时候需要用到Java调用js文件执行相应的方法 在JDK1.6添加了新的ScriptEngine类,允许用户直接执行js代码. import org.junit.Test; import ...
- java调用js脚本语言
在我们开发的过程中,可能有这么一种情况,在java中需要取调用js方法完成一些事情.那么什么时候可能出现这种情况呢.比如我们使用爬虫模拟登录别的网站,但有些网站前台使用js对密码进行了加密处理,那么就 ...
- java利用JDK调用并执行js源码
前言: 不同开发语言之间具有通用性,更具有协作调用的可能.有时候对于一些场景会有调用js的需求,因此下面展示了一个java利用自身JDK调用js函数的demo,供感兴趣的朋友参考. js函数文件 ex ...
- 在Java中执行js代码
在某些特定场景下,我们需要用Java来执行Js代码(如模拟登录时,密码被JS加密了的情况),操作如下: ScriptEngineManager mgr = new ScriptEngineManage ...
- java中执行js代码
要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...
- 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果
今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...
- java中执行JS脚本
package 测试包; import javax.script.*; public class SSSSSSSSS { public SSSSSSSSS() { // TODO Auto-gener ...
- java 脚本引擎执行js
为用到时,使用方便直接保存一下代码 package com.xzlf.reflectTest; import java.io.BufferedReader; import java.io.FileIn ...
- selenium java ,执行js改变页面
1.面对页面一些页面上的限制而导致某些选择按钮无法选中的问题 很多时候由于页面上的一些限制会导致我们无法无法正常用webdriver来实现我们手动的正常操作,这时候我们可以通过执行js来适当的改变页面 ...
随机推荐
- 018、MySQL取满足日期在两个日期之间的所有数据
#查询 SELECT GZJK_CREATEDATE FROM abc_table WHERE ( ( GZJK_CREATEDATE >= UNIX_TIMESTAMP( '2019-08-0 ...
- C++远征--jame_yuan(慕课网)
int &a=b;引用符 int const a = 3; int *p = &a; 只读 不能 赋给 读写 有默认参数值得参数必须在参数表的最右端 void fun(int ...
- Spring入门之四-------SpringIoC之其他知识点
一.懒加载 public class Bean1 { public Bean1() { System.out.println(this.getClass().getSimpleName() + &qu ...
- 从PC厂商狠抓粉丝经济看,春天将至?
10月中旬,市场研究机构IDC发布的全球三季度PC出货量报告显示,第三季度全球个人电脑出货量总计6740万台,比去年同期下降0.9%.似乎这一数据的发布,依旧在证明着PC市场的颓势.但在这样的大背景下 ...
- plsql调用执行存储过程
参考 https://www.cnblogs.com/enjoyjava/p/9131169.html ------------------------------------------------ ...
- 在 Windows 系统上安装 Jekyll
目录 安装 Ruby 环境 用 Bundler 安装 Jekyll 本文是写给完全未用过 Ruby 乃至命令行工具者的.对于一般的开发者,Jekyll 官方文档的相关内容已然足够. 本文为钱院学辅技术 ...
- 《新标准C++程序设计》3.6-3.7(C++学习笔记9)
一.成员对象和封闭类 (1)定义 一个类的成员变量如果是另一个类的对象,就称之为“成员对象”. 包含成员对象的类叫封闭类. (2)封闭类构造函数的初始化列表 在构造函数中添加初始化列表的写法: 类名: ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 标准库
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...
- webpack散记---提取公共代码
(1)作用: 减少代码冗余 提高加载速度 (2)来源 commonsChunkPlugin webpack.optimize.CommonsChunkPlugin (3)配置 { plugins:[ ...
- Atom :奥特曼的使用
最近在使用atom的编译器,很不爽,什么快捷键,还有识别vue的页面,还有注释这种快捷下载下来的都没有 必须到setting里面的install里下载,我能大声的说我很不爽吗............ ...