起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4076|回复: 13

[结贴] 5.2.7版本中在JavaScript中处理DocUrl 中有缺陷的逻辑

[复制链接]

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
发表于 2014-10-17 15:35:19 | 显示全部楼层 |阅读模式
版本: X5.2.7 小版本号:
数据库: MySQL 服务器操作系统: 应用服务器:
客户端操作系统: 浏览器:
在UI/system/doc 下 相关的 .js 和 .w 中出现了多处  处理文档url 的代码。
代码逻辑都类似如下:
        u=justep.Doc2.getdocServerAction(docPath, "/repository/file/view/" + fileID + "/" + versionID + "/" + partType,true);
        var docUrl = u.indexOf(window.location.protocol) <1 ? u : window.location.protocol+"//"+ window.location.host + u;

这是一个 判断是否要加URL http: 或者 https: 前缀的代码, 并生成绝对URL路径字符串。
实际使用中 当 u 中间没有 http: 字符串的时候, 导致docUrl 结果变量并没有加上 window.location.protocol 协议前缀。

因为上面的错误逻辑导致 查看office文档过程是报出异常。


在 在UI/system/doc 下 相关的 .js 和 .w 中都出现了这种逻辑。 (大概是 copy/paste 的原因)


我将 u.indexOf(window.location.protocol) <1  修改为 u.indexOf(window.location.protocol) == 0  
则结果正确。
我判断这个
u.indexOf(window.location.protocol) <1 这个处理逻辑是错误的, 因为包含有 u.indexOf(window.location.protocol) 结果为-1的可能


盼望项目组 将UI/system/doc 下 相关的 .js 和 .w 中出现.indexOf(window.location.protocol) 的代码部分都检查核对一遍



91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36090
发表于 2014-10-17 16:07:13 | 显示全部楼层
这段应该是正确的
上面的错误逻辑导致 查看office文档过程是报出异常。 具体的异常信息是什么?
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
 楼主| 发表于 2014-10-17 16:33:42 | 显示全部楼层
本帖最后由 linxin@msn.com 于 2014-10-17 17:17 编辑

异常信息是 officeViewerWindow.w 的 69 行 显示的 : office文件打开异常 错误编码[8]
请检查 this.getUrl 这个方法的逻辑。
                                getUrl:function(docPath,fileID){
                            if(!this.docUrl){
                                    var u = justep.doc.InnerUtils.getdocServerAction(docPath, "/repository/file/cache/office/"+fileID);
                                           this.docUrl = u.indexOf(window.location.protocol) <1 ? u : window.location.protocol+"//"+ window.location.host + u;
                                          
                            }
                            return this.docUrl;         
                    },


我调试过。 那个u 变量 值 是 :
"/x5/UI/system/service/doc/common/uploadDoc.j?
dochost=http%3A%2F%2Flocalhost%3A8080%2FDocServer%2Frepository%2Ffile%2Fcache%2Foffice%2F112-defaultDocNameSpace%3Fkey%3Df933c7f22e58992ce220df61190a807ed0427e9bf8e10af1e53c7e0f8b5b494f866eec09a41ab9342499c1c3713c41b7d7e78722e5c6450b13902c3d7639fa55575d67e2c3cabdc2d176b60ed7730ec601197fcd79d3a62bc086cd377a2c49c0a4a1d4a9ac359be6&bsessionid=B105339E2357A203535B1BEAC82D668C"  
最后 this.docUrl 的结果和 u 变量一样的。 并没有加上 http: //localhost 前缀。。导致最后的异常。

我将u.indexOf(window.location.protocol) < 1 换为 u.indexOf(window.location.protocol) ==0  结果就没有错误了。
回复 支持 反对

使用道具 举报

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
 楼主| 发表于 2014-10-17 16:37:47 | 显示全部楼层
本帖最后由 linxin@msn.com 于 2014-10-17 16:38 编辑

u.indexOf(window.location.protocol) <1 ? u : window.location.protocol+"//"+ window.location.host + u;
的操作结果等同于
if (u.indexOf(window.location.protocol) >=1 ) {
    u = window.location.protocol+"//"+ window.location.host + u;
}

导致只有在字符串 u "内部中含有" window.location.protocol  才会被加上前缀。
所以 上述的字符串操作逻辑是有缺陷的。
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36090
发表于 2014-10-17 17:08:55 | 显示全部楼层
具体怎么操作能重现这个问题?
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
 楼主| 发表于 2014-10-17 17:09:21 | 显示全部楼层
本帖最后由 linxin@msn.com 于 2014-10-17 17:11 编辑

我找到出现这个现象的原因了: 我改动过DocUtil.java 中的addUIProxyPart 代码了。 这是我改动的代码:
        public static String addUIProxyPart(String url){
                try {
                        return UIPROXYURL + URLEncoder.encode(url,"utf8");
                } catch (UnsupportedEncodingException e) {
                        throw new RuntimeException(e);
                }
        }


我还原成原始版本。

上面那个u 变量 值 变成是 :
"/x5/UI/system/service/doc/common/uploadDoc.j?
dochost=http://localhost:8080/DocServer/repository/file/cache/Foffice/112-defaultDocNameSpace/key/f933c7f22e58992ce220df61190a807ed0427e9bf8e10af1e53c7e0f8b5b494f866eec09a41ab9342499c1c3713c41b7d7e78722e5c6450b13902c3d7639fa55575d67e2c3cabdc2d176b60ed7730ec601197fcd79d3a62bc086cd377a2c49c0a4a1d4a9ac359be6&bsessionid=B105339E2357A203535B1BEAC82D668C"  

我改动 addUIProxyPart 方法的原因是 那个原版合成的 url 有不规范字符的缺陷。
原始版本但是带来的字符串是恰巧是含有 http: 的字符串。阴差阳错地导致了 最后传给office 组件的url 上 强制加上了  url http 完整路径。

总结一下: DocUtil.java 中的addUIProxyPart  中错误的合成参数的用法 ,恰恰 使得 原先错误的逻辑
u.indexOf(window.location.protocol) >=1 情况下 加http前缀的
意外获得了正确的结果。
回复 支持 反对

使用道具 举报

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
 楼主| 发表于 2014-10-17 17:14:42 | 显示全部楼层
你不用重现了, 找你们做过程序员的人,目测就可以知道逻辑有问题, 你把我上述所有信息转给程序人员, 让他判断我说的逻辑错误是否合理。
回复 支持 反对

使用道具 举报

91

主题

13万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
36090
发表于 2014-10-17 17:30:17 | 显示全部楼层
2楼回复之前就已经让相关人员看过,说逻辑是正确的
远程的联系方法QQ1392416607,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题  WeX5教程  WeX5下载



如按照该方法解决,请及时跟帖,便于版主结贴
回复 支持 反对

使用道具 举报

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
 楼主| 发表于 2014-10-17 18:34:48 | 显示全部楼层
本帖最后由 linxin@msn.com 于 2014-10-17 18:44 编辑

你最好非常认真的问问你们资深的程序员,我做了二十年的程序了, 并且我之前也为你们提供过多次缺陷报告。

这个问我再说明一下:

officeViewerWindow.w 原有方法:
  1. getUrl:function(docPath,fileID){
  2.     if(!this.docUrl){
  3.         // 下面的方法是求一个url.
  4.         var u = justep.doc.InnerUtils.getdocServerAction(docPath, "/repository/file/cache/office/"+fileID);
  5.          // 调试u 的数值: "/x5/UI/system/service/doc/common/uploadDoc.j?dochost=http://localhost:8080/DocServer/repository/file/......."
  6.          this.docUrl = u.indexOf(window.location.protocol) <1 ? u : window.location.protocol+"//"+ window.location.host + u;
  7.          //  上面一行的逻辑应该是判断如果u的字符串是不以"http:" 为开头, 则添加 http://host 到 的前部。
  8.          //  标准的逻辑代码应该为: this.docUrl = u.startWith("http:")? u: "http://host"+u
  9.           //  但是实现代码u.indexOf(window.location.protocol) < 1 却变成了
  10.           //   this.docUrl = u.notExistsOrstartWith("http:")? u: "http://host"+u
  11.     }
  12.      return this.docUrl;         
  13.   },
复制代码

在 officeViewerWindow.w  打开office 文档时需要通过这个getUrl 函数 获得完整文档字节流的 url 。而且这个url 必须要以http:开头

而原有的逻辑必须依赖  url 不是以 http: 开头。 并且 内部 包含 http:  

这是一个明显很滑稽的逻辑。只是非常碰巧, url 的串中host参数值是含有"http:" 参数。如果url内部的host参数串变为 https: (这是可能存在的) 将会导致系统错误, 其实 那个url 也并不合规,://等符号没有进行UrlEncode,如果host参数做了URLEncode ,可能早就发现错误了。

这个逻辑错误还是很明显的,如果那个程序员一定认为没有问题,结论只有两个
   他不理解js 的那段逻辑 或者 他有点不负责任。

这是一个非常滑稽的逻辑,完全依赖于另一个意外的参数缺陷。




回复 支持 反对

使用道具 举报

10

主题

35

帖子

148

积分

初级会员

Rank: 2

积分
148
QQ
 楼主| 发表于 2014-10-20 14:37:10 | 显示全部楼层
请关注一下!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-1-15 23:39 , Processed in 0.105562 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表