非标准对外开放接口(非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要么是客户传过来,要么自行业务确认。
推荐阅读