Java执行js加密算法

Java执行js加密算法

今日需求:在后端执行一段加密算法,算法是js写的

明白需求以后疯狂百度。最后发现JDK提供了各种脚本的支持(怪笔者学艺不精,第一次见识到这个库,留下不学无术的泪水),正题开始,Java如何执行一段加密算法呢?

java对脚本的支持全部存放于javax.script包下

接口:
    Bindlings
    Compilable
    Invocable
    ScriptContext
    ScriptEngine
    ScriptEngineFactory
类:
    AbstractScriptEngine
    CompiledScript
    ScriptEngineManager
    SimpleBindings
    SimpleScriptContext
异常:
    ScriptException 

我们本次使用到的有ScriptEngineManagerScriptEngineInvocable

ScriptEngineManagerScriptEngine 类实现一个发现和实例化机制,还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态。此类使用服务提供者机制枚举所有的 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代码

  1. 定义一个静态方法
static String fun1(String name){
    System.out.format("this is java code , %s"+name);
    return "thank you";
}
  1. 在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 

执行完毕

原文地址:https://www.cnblogs.com/onlyzuo/p/12268144.html

时间: 2024-11-11 06:22:45

Java执行js加密算法的相关文章

Java执行js代码

在做项目中有时候需要用到Java调用js文件执行相应的方法 在JDK1.6添加了新的ScriptEngine类,允许用户直接执行js代码. import org.junit.Test; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; /** * @author ceshi * @Title: JunitTestJS * @Projec

Java执行js脚本

aaa package cn.sniper.spider.utils; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.net.URL; import javax.script.Invocable; import j

java中执行js代码

要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return a+b; } 然后在java中写代码: public class ZipTest { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineMa

java 脚本引擎Rhino执行js代码和文件

测试js脚本引擎 public class helloworld { public static void main(String[] args) throws Exception { //获得脚本引擎对象 ScriptEngineManager sem=new ScriptEngineManager(); ScriptEngine engine=sem.getEngineByName("javascript"); //定义变量,会存储到引擎上下文种,java和js都能取到 engin

在CMD下启动vmware、Xshell连接虚拟机以及控制Chrome浏览器自动执行js登录校园网

标题有点长,主要是写个bat出来玩玩, (1)不用每次都手动关闭mysql服务(我不想把它设为手动启动,有强迫症) (2)然后希望每次vmware能自动连上虚拟机 (3)以及每次Xshell都能自动启动,然后就连上虚拟机 (4)然后校园网每次都要打开,输入帐号密码什么的,才能连网,我希望它自己搞定 做完了这几步还是有点意思的,主要是浏览器还是网页的什么自动化测试,然后eclipse下项目打包成可执行的jar包 现在听我娓娓道来吧! 前面要达到的目的跟着后面的命令并无关联 (1)首先在bat里面关

android混合开发,webview的java与js互操作

android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用webView.load("javascript:someFunction()"); 这样可以调用webView里页面上的全局方法.这不是什么新鲜东西,你在网页中也可以这么做,试试在浏览器地址栏输入javascript:alert("427studio");也可以在浏览器地址

使用Webdriver执行JS

首先,我们使用如下方式初始化driver: Java代码   WebDriver driver = new FirefoxDriver(); JavascriptExecutor jse = (JavascriptExecutor)driver; 1.直接传入Javascript代码 可以直接给jse传入javascript代码: Java代码   jse.executeScript("window.document.getElementById('jingshou').click()"

React Native Android 源码框架浅析(主流程及 Java 与 JS 双边通信)

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 有了前面<React Native Android 从学车到补胎和成功发车经历>和<React Native Android Gradle 编译流程浅析>两篇文章的学习我们 React Native 已经能够基本接入处理一些事情了,那接下来的事情就是渐渐理解 RN 框架的一些东西,以便裁剪和对 RN 有个更深入的认识,所以本篇总结了我这段时间阅读源码

Android WebView加载本地html并实现Java与JS交互

最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是如果资源多了,当然就很慢.图片.css .js .html这些资源每个大概需要10-200ms ,一般都是30ms就ok了.不过webview是必须等到全部资源都完成加载,才会进行渲染的,所以加载的速度很重要!从Google上我们了解到,webview加载页面的顺序是:先加载html,然后从里面解析