【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

一、特殊名词介绍

二、背景、场景介绍

早期帆软产品中绝大部分的WEB服务都是通过op和cmd这两个参数来指定的。而随着产品升级到10.0以后,平台引入了spring框架,所有的旧的服务类接口对平台来说就完全没用了。相应的早期的10.0也就提供了一个新的web服务的接口HttpHandlerProvider。

这个接口目前也是插件中开放web服务使用最为广泛的接口。支持热加载。

三、接口介绍

HttpHandlerProvider.java
package com.fr.decision.fun;

import com.fr.stable.fun.mark.Mutable;

/**
 * Created by loy on 2018/9/3.
 */
public interface HttpHandlerProvider extends Mutable {

    String XML_TAG = "HttpHandlerProvider";

    int CURRENT_LEVEL = 1;

    /**
     * 使用的时候尽可能继承抽象类{@link com.fr.decision.fun.impl.BaseHttpHandler}
     * @return http操作类
     */
    HttpHandler[] registerHandlers();
}

HttpHandler.java
package com.fr.decision.fun;

import com.fr.third.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by loy on 2018/9/3.
 *
 * HTTP路由处理器
 */
public interface HttpHandler {

    /**
     * HTTP方法
     * @return 返回null时匹配所有方法
     */
    RequestMethod getMethod();

    /**
     * 路由路径
     * 例如:
     *     /
     *     /foo
     *     /aaa/bbb
     */
    String getPath();

    /**
     * 是否为公开路由(不需要登录就能访问)
     */
    boolean isPublic();

    /**
     * 处理请求
     */
    void handle(HttpServletRequest req, HttpServletResponse res) throws Exception;

    /**
     * 是否必须超管访问, isPublic为false才生效
     */
    boolean needAdmin();

    /**
     * 管理系统鉴权,非空时则会对管理系统鉴权, 多个节点id取并,isPublic为false才生效
     *
     * @return 管理系统节点id。内置管理系统节点id见com.fanruan.api.decision.AuthorityKit.Management
     */
    String[] modules();

    /**
     * 其他鉴权手段,鉴权结果与超管鉴权,管理系统节点鉴权取并
     * @param userId 用户id
     * @return 鉴权成功与否
     */
    boolean accessControl(String userId);
}


四、支持版本

产品线

版本

支持情况

备注

FR10.0支持
BI5.1支持
BI5.1.2支持
BI5.1.3支持

五、插件注册

plugin.xml
<extra-decision>
    <HttpHandlerProvider class="your class name"/>
</extra-decision>

六、原理说明

接口注册逻辑:插件服务模块(PluginServiceActivator)在加初始化时,会通过PluginServiceManager#init方法读取到所有插件中申明的web接口实例。并注入到handlerMap成员中。

接口生效逻辑:产品中存在两个spring的服务入口,PluginPrivateService 和 PluginPublicService 。客户端通过 /plugin/public/或 /plugin/private/这两个路由调用服务,然后通过服务申明的接口方法调用到PluginServiceManager#handleRequest。进一步从handlerMap成员中匹配到对应的服务从而生效。

七、特殊限制说明

此接口最终有两个调用的路由,一个是/plugin/public/,另一个是 /plugin/private/。在插件中我们通过指定 boolean isPublic(); 接口返回值来指定具体的路由。返回true时路由为/plugin/public/,否则为 /plugin/private/。

接口调用的完整url为:http(s)://ip:port/webroot/decision/plugin/public或private/$pluginID/$path。

所有满足/plugin/public/* 和  /plugin/private/* 的请求会优先匹配$pluginID。找到对应插件声明的所有服务接口。

然后再通过getMethod()、getPath()、isPublic() 、三个方法进行接口的匹配,三个方法都与请求信息一致时,就算匹配成功。同一个路由只会匹配到一个接口执行,根据优先匹配到优先生效为原则。

对于isPublic()返回的是false的接口,则会额外匹配needAdmin()、modules()、accessControl(String userId) 三个权限控制的接口方法,只有3个方法锁包含的权限均满足,才能通过验证(也就是3个方法是“与”的关系)

accessControl(String userId) 方法需要注意,入参是用户ID,不是用户名。基于用户名的匹配需要开发者自行根据FineKit等相关方法进行转换。

八、常用链接

demo地址:demo-http-handlerdemo-web-request

常用module值

com.fr.decision.fun.URLAliasProvider

(1)、三组开放web服务接口的插件接口对比

九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。禁止用于任何商业用途,若作为商用一切后果责任由使用者自行承担。

open-JSD-8016

open-JSD-7868

open-JSD-7837

open-JSD-7660

open-JSD-7639

open-JSD-7546

open-JSD-7339

  • No labels