zoukankan      html  css  js  c++  java
  • 安全性及其它

    JSBridge类管理暴露给前端方法,前端调用的方法应该在此类中注册才可使用。register的实现是从Map中查找key是否存在,不存在则反射取得对应class中的所有方法,具体方法是在BridgeImpl中定义的,方法包括三个参数分别为WebView、JSONObject、CallBack。如果满足条件,则将所有满足条件的方法put到map中。

    private static Map<String, HashMap<String, Method>> exposedMethods = new HashMap<>();
    public static void register(String exposedName, Class<? extends IBridge> clazz) {
    if (!exposedMethods.containsKey(exposedName)) {
    try {
    exposedMethods.put(exposedName, getAllMethod(clazz));
    } catch (Exception e) {
    e.printStackTrace(http://www.amjmh.com);
    }
    }
    }

    复制代码
    JSBridge类中的callJava方法就是将js传递过来的URL解析,根据将要调用的类名从刚刚建立的Map中找出,根据方法名调用具体的方法,并将解析出的三个参数传递进去。

    public static String callJava(WebView webView, String uriString) {
    String methodName = "";
    String className = "";
    String param = "{}";
    String port = "";
    if (!TextUtils.isEmpty(uriString) && uriString.startsWith("JSBridge")) {
    Uri uri = Uri.parse(uriString);
    className = uri.getHost();
    param = uri.getQuery();
    port = uri.getPort() + "";
    String path = uri.getPath();
    if (!TextUtils.isEmpty(path)) {
    methodName = path.replace("/", "");
    }
    }


    if (exposedMethods.containsKey(className)) {
    HashMap<String, Method> methodHashMap = exposedMethods.get(className);

    if (methodHashMap != null && methodHashMap.size() != 0 && methodHashMap.containsKey(methodName)) {
    Method method = methodHashMap.get(methodName);
    if (method != null) {
    try {
    method.invoke(null, webView, new JSONObject(param), new Callback(webView, port));
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    return null;
    }

    复制代码
    CallBack类是用来回调js中回调方法的Java对应类。Java层处理好的返回结果是通过CallBack类来实现的。在这个回调类中传递的参数是JSONObject(返回结果)、WebView和port,port应与js传递过来的port相对应。

    private static Handler mHandler = new Handler(Looper.getMainLooper());
    private static final String CALLBACK_JS_FORMAT = "javascript:JSBridge.onFinish('%s', %s);";
    private String mPort;
    private WeakReference<WebView> mWebViewRef;

    public Callback(WebView view, String port) {
    mWebViewRef = new WeakReference<>(view);
    mPort = port;
    }
    public void apply(JSONObject jsonObject) {
    final String execJs = String.format(CALLBACK_JS_FORMAT, mPort, String.valueOf(jsonObject));
    if (mWebViewRef != null && mWebViewRef.get() != null) {
    mHandler.post(new Runnable() {
    @Override
    public void run() {
    mWebViewRef.get().loadUrl(execJs);
    }
    });
    }
    }

  • 相关阅读:
    JSON——JavaScript 对象表示法(JavaScript Object Notation)。
    jquery—— jQuery 是目前最流行的 JS 框架
    Bootstrap的css
    markdown编辑器与富文本编辑器优缺点比较--转载好文
    MATLAB绘图设置--中坐标显示间隔以及范围设置
    MATLAB绘图中参数导数的标注方法
    MATLAB 读取和写出Excel文件的方法-单个以及自动循环读写多个情况
    matlab 求和
    MATLAB画图中设置Marker过于密集怎么办-解决方法
    MPC特点原理以及各项参数的选择--引用别人的博客网址
  • 原文地址:https://www.cnblogs.com/ly570/p/11291184.html
Copyright © 2011-2022 走看看