現在、Microsoftが提供するJavaScriptインターフェイスを使用してMS Word Office Addinを開発中です。私はDjangoバックエンドを使ってテスト実装を行いました。Officeアドイン開発 - 不正なGET URL(_host_Info = ...)
しかし、最終製品では、私のコントロールできない複数の構成で動作する既存のJavaバックエンドと機能を統合する必要があります。 UIのためのVaadinと主にサーブレットコンテナとしてのTomcat(しかし必ずしもそうではない)から成っています。
Wordで実行されているIFrameが、urlencodeされていないパイプ文字を含む不要な形式の_host_infoを要求URLに追加するという問題が発生しました。 例: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のマニフェストファイルでは、以下のようなソースURLしか指定しないので、情報が自動的に追加されるためです。
<SourceLocation DefaultValue="https://localhost:8443/myapp/ " />
Documentationが、私はそこで、この動作を見つけられませんでしたチェックので、私は何かが欠けている可能性があります。ホスト情報の問い合わせはthisブログ記事に記載されていますが、URLの一部ではないようです。
私は追加からOfficeアドインを停止することができます方法はあり: _host_Info =ワード| Win32の| 16.01 | EN-US HTTP /リクエストに1.1?
もしそうでなければ、TomcatでURLのその部分をフィル/無視する正しい方法がありますか?アプリケーション全体が私のApache Webserver & Django Backendで正しく動作しているので、URLも受信されましたが動作しました。
質問2のように、問題のパラメータを削除する必要があるサーブレットフィルタを実装しようとしました。しかし、同じ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)
更新:問題の回避策として
次のクイック&ダーティハック機能します。それでも、彼らは情報をそのようにエンコードすることを選んだ理由として困惑:
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のバージョンを使用する方法はありません。このような小さな、おそらく役に立たない文字列は、このような問題を展開に使うことができるので、この状況がすぐに変わることを本当に願っています。
ご返信ありがとうございます!それは吸う、私はあなたがその間に解決策を見つけたことを願っています。フィルタリングするために正しいServlet Filter Parameterを見つけることができましたが、今はVaadinとうまく統合されています。まだ...迷惑。私は私の回避策で投稿を編集しました。 –
はい、ソリューションはマイクロソフトに戻って、URLを変更して、角でダイジェストループを引き起こすような方法ではないと伝えました。明らかに彼らは働いているか、すでにパッチをリリースしています。 :) –