页面树结构
转至元数据结尾
转至元数据起始

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

« 前一个 版本 6 下一个 »

在进行多系统集成的时候,是不是经常会被各种集成问题给难道,集成很多细节点没有注意导致集成失败,引发了一系列的疑问:

  1. 为什么openresource集成请求参数传递失败?
  2. 为什么令牌token令牌解析失败?
  3. 为什么令牌token登录之后参数传递失败
  4. ......

下面我们就从基础出发,深入探究基础的秘密。


1、选择正确的传参字符串json

在资源集成的时候,openresource请求的paramsInfo、paramsInfoBase64两个参数是用来传递参数,传递的参数信息需要一个json格式的字符串,在不同的资源里其传递的字符串格式是不一样的。需要根据不同的资源选择正确的参数json串,选择正确的传参字符串参数传递的问题可以解决70%的问题。

http://localhost:18080/smartbi/vision/openresource.jsp?resid=I402881e5019608c408c4fb7801960e2ec9b42d3d&paramsInfo=

各资源参数选择如下

电子表格、旧即席查询、旧透视分析
单参数: [{"name":"发货区域", "value":"华北","displayValue":"华北"}]

多参数: [{"name":"发货区域", "value":"华北","displayValue":"华北"},{"name":"订单年份", "value":["2020","2021"],"displayValue":["2020","2021"]}]
仪表盘、新即席查询、新透视分析
单参数: {"订单年份":{"values":["2020"]}}

多参数: {"订单年份":{"values":["2020"]}, {"订单月份":{"values":["2020-01"]}}

注意:仪表盘除去以上格式之外也支持使用电子表格的参数传递方式

2、url转码

在选择正确的参数之后,拼接得到最终访问资源的请求,具体可以参考如下示例。那么如下链接如果直接访问会有哪些问题呢?

http://localhost:18080/smartbi/vision/openresource.jsp?resid=I402881e5019608c408c4fb7801960e2ec9b42d3d&paramsInfo=[{"name":"发货区域", "value":"华北","displayValue":"华北"}]

在参数的链接中我们可以发现其存在中文数据,同时也存在特殊字符,访问时就很可能会出现如下Tomcat报错"HTTP状态 400 - 错误的请求"的报错,在报错的描述信息中可以看到原本paramsInfo后面加的参数变成了一堆编码,其错误描述中大致的意思是请求信息中有无效的字符导致的。

出现这个问题是因为tomcat高版本严格按照RFC 3986规范解析地址。该规范只允许包含a-zA-Z 0-9 - _ . ~ 以及所有保留字符 ! * ’ ( ) ; : @ & = + $ , / ? # [ ]

所以当请求中有除去上述的特殊字符或中文的时候基于Tomcat的限制,会识别不到请求所以抛出400的错误状态码。那实际遇到这种问题的时候又改如何解决呢?

方案一:使用 encodeURIComponent 函数进行url转码

url转码是浏览器请求时面对不合法的请求时进行转化的重要手段,实现的原理是将需要转码的字符,按指定编码方式(默认使用UTF-8编码)转化为字节流,然后每个字节按16进制表示,最后添加%组成一个percent编码,最终就会变成%+16进制+16进制的格式

例如:你好

  • UTF-8字节流打印为:-28 -67 -96 -27 -91 -67
  • 对应的16进制表示为:E4 BD A0 E5 A5 BD
  • URLEncode编译后为:%E4%BD%A0%E5%A5%BD

此时转码之后的字符就可以被浏览器识别,所以只需要将paramsInfo后面的参数内容全部进行url转码之后拼接到请求中就可以被Tomcat识别。如下这里我们直接在浏览器控制台中使用encodeURIComponent,得到的结果拼接成完整的url请求具体如下。此时就可以正常访问并且传参成功,在实际开发场景中只需要将拼接之后参数json进行字符串格式化之后再拼接到请求中即可完成参数传递。

http://localhost:18080/smartbi/vision/openresource.jsp?resid=I402881e5019608c408c4fb7801960e2ec9b42d3d&paramsInfo=%5B%7B%22name%22%3A%22%E5%8F%91%E8%B4%A7%E5%8C%BA%E5%9F%9F%22%2C%22value%22%3A%22%E5%8D%8E%E5%8C%97%22%2C%22displayValue%22%3A%22%E5%8D%8E%E5%8C%97%22%7D%5D


方案二:修改tomcat的server.xml配置文件

在Tomcat/conf/server.xml文件中,可以在请求端口的配置中添relaxedPathChars="|{}[],%"relaxedQueryChars="|{}[],%" 两个参数同样也可解决该问题,特殊情况下还需要多添加一个URIEncoding="UTF-8" 的参数,避免因为字符集导致的转码异常。

注意:若为window一键安装部署Tomcat,默认情况下这些参数是已经添加过的。

3、base64加密

在实际生产的过程中使用openresource.jsp集成资源的时候,除去会遇到Tomcat无法识别字符的问题之外,还可能或有参数过多请求头过长请求被拦截、请求中大量的特殊字符被网络安全策略拦截等各式各样的场景,那是否还有其他办法规避掉这些问题?

  • 无标签