微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Office加载项开发 – 格式错误的GET URL(_host_Info = …)

我目前正在使用Microsoft提供的 JavaScript界面​​开发MS Word Office Addin.我使用Django后端进行了测试实现,其中一切正常.

但是对于最终产品,我必须将功能集成到以多种配置运行的现有Java后端,这些配置是我无法控制的.由用户界面的Vaadin组成,主要是Tomcat(但并不总是)作为Servlet容器.

我遇到了一个问题,即在Word中运行的IFrame会将不需要的和格式错误的_host_info附加到请求URL,其中包含un-urlencoded管道符.
例如:Tomcat日志:

"GET /myapp/?_host_Info=Word|Win32|16.01|en-US HTTP/1.1" 200 2101

此格式错误的URL会产生以下异常:

java.lang.RuntimeException: Invalid location URI received from client.
... full stack trace at bottom of the post...
Caused by: java.net.URISyntaxException: Illegal character in query at index          45: https://localhost:8443/myapp/?_host_Info=Word|Win32|16.01|en-US

据我所知,我无法控制是否将此参数附加到URL,因为在Addin的Manifest文件中我只指定了如下所示的源URL,并且信息会自动添加.

<SourceLocation DefaultValue="https://localhost:8443/myapp/ " />

检查Documentation我没有在那里找到这种行为,所以我可能会遗漏一些东西.查询主机信息在this博客文章中提到,但它似乎不应该是URL的一部分.

>有没有办法可以阻止Office加载项附加:
?_host_Info = Word | Win32 | 16.01 | zh-CN HTTP / 1.1请求?
>如果没有,是否有正确的方法来使用Tomcat过滤/忽略URL的那部分?由于整个应用程序已经使用我的Apache Webserver& Django Backend,也收到了URL,但它有效.

至于问题二,我已经尝试实现一个应该删除相关参数的Servlet过滤器.但由于它依赖于相同的Java库来解析URL以查看它,因此抛出了相同的异常.

> May 23,2016 11:04:51 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [MyUIServlet] in context with path [/word-to-moxis] threw exception [com.vaadin.server.ServiceException: java.lang.RuntimeException: Invalid location URI received from client] with root cause
java.net.URISyntaxException: Illegal character in query at index h(invalidated link because of 10 reputation / two links allowed policy)ttps://localhost:8443/myapp/?_host_Info=Word|Win32|16.01|en-US
    at java.net.URI$Parser.fail(URI.java:2848)
    at java.net.URI$Parser.checkChars(URI.java:3021)
    at java.net.URI$Parser.parseHierarchical(URI.java:3111)
    at java.net.URI$Parser.parse(URI.java:3053)
    at java.net.URI.<init>(URI.java:588)
    at com.vaadin.server.Page.init(Page.java:651)
    at com.vaadin.ui.UI.doInit(UI.java:679)
    at com.vaadin.server.communication.`UIInitHandler`.getbrowserDetailsUI(UIInitHandler.java:214)

更新:

以下Quick& Dirty Hack可以解决问题.仍然感到困惑的是他们为什么选择以这种方式编码信息:

public class AddinServletRequestWrapper extends HttpServletRequestWrapper {

    Map<String,String[]> parameterMap;

    public AddinServletRequestWrapper(HttpServletRequest originalRequest) {
        super(originalRequest);
        parameterMap = new HashMap<String,String[]>(originalRequest.getParameterMap());
        parameterMap.remove("_host_Info");
    }

    @Override
    public String getParameter(String name) {
        // Todo: Improve
        String[] value = parameterMap.get(name);
        if (value == null || value.length == 0)
            return null;
        if(name == "v-loc"){
            return value[0].replace('|','_');
        }

        return value[0];
    }
}

更新2 / Feb17:

随着最近的Tomcat更新,上面的解决方法不再足够.如评论中所述,版本7.0.73,8.0.39,8.5.7具有更严格的URL策略.因此,没有解决方案可以使用tomcat版本来托管办公室加载项而无需额外的工具.我真的希望这种情况很快就会发生变化,因为这样一个小的,可能无用的字符串可以在部署中使用这些问题.

解决方法

更新:
该API现在可供使用:

的console.log(Office.context.host); //示例:Excel

的console.log(Office.context.platform); //示例:PC,MAC,IOS,null(对于独立网站)

主机的可能值为:

高强
微软幻灯片软件
外表
OneNote中
项目
访问

平台的可能值为:
个人计算机
OfficeOnline
苹果电脑
iOS版
Android的
普遍

我们最近根据单页面应用程序中提到的问题从URL中删除查询参数.对于在浏览器中打开的加载项(Office Online),不再附加_host_info_.

@Matthias:对于这个问题,添加office-js标签会更准确.鉴于标签的大小限制,我无法追加.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?