非标准对外开放接口(非openApi、免登录、接口路径自定义)实现案例分享原创
金蝶云社区-丁梦洋
丁梦洋
10人赞赏了该文章 1,071次浏览 未经作者许可,禁止转载编辑于2023年02月02日 16:22:16

问题描述

某客户需要苍穹提供对外接口,由于某些原因,对接口url格式有要求,openApi自动生成的接口路径/kapi/v2/xxx并不符合,且需要免登录


苍穹版本

5.0.003


处理方案

        最开始还是坚持想用openApi提供接口,免登录这块使用基本认证,客户调用时url上带上固定参数签名,但由于url格式这一项要求太死且不能携带参数,故此方案毙掉。

        也思考过配置spring web,自己写controller,社区里没搜到相关内容,故此方案毙掉。

        后在社区搜到可自定义filter,于是采用直接在filter里匹配url路径,做不同业务处理的“原始”方法,踩过一些坑后,可以解决问题。下面介绍下相关配置及代码。


1.mc配置自定义filter配置项

基础数据维护—环境公共配置项,找个目录新增配置:

KFilterConfigFiles.config=xxFilter.xml


2.创建filter配置文件

resource目录创建xxFilter.xml文件(常规servlet配置)

<?xml version="1.0" encoding="UTF-8" ?>
<web-app>

   <filter>
      <filter-name>TestFilter</filter-name>
      <filter-class>com.test.TestFilter</filter-class>
      <filter-mapping>
         <url-pattern>/test/*</url-pattern>
      </filter-mapping>
   </filter>
</web-app>


3.创建filter java文件

public class TestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //由于查询数据库操作会校验线程是否为线程池所管理,这里手动介入
        ManagedThreadFeature feature = new ManagedThreadFeature();
        feature.start();

        //手动创建请求上下文,查询数据库时等很多地方要用到
        RequestContext context = RequestContext.create();
        context.setAccountId("123");
        context.setTenantId("123");
        context.setUserId("123");
        context.setTraceId(TraceIdUtil.createTraceIdString());
        RequestContext.set(context);

        try {
            //业务处理
        }finally {
            feature.end();
        }
    }
}


4.修改nginx配置

location 那加上新的匹配:/ierp/xxx


客户访问接口地址:ip:port/ierp/xxx


注意:由于苍穹做了租户系统做数据隔离,还有用户角色等做数据权限,这里设置请求上下文时的tenantId和userId要么是客户传过来,要么自行业务确认。

       




赞 10