В настоящее время я разрабатываю надстройку MS Word Office, используя интерфейс JavaScript, предоставленный Microsoft. Я сделал тестовую реализацию с использованием бэкэнда Django, где все работало нормально.
Однако для конечного продукта мне нужно интегрировать функциональность с существующим Java Backend, который работает в нескольких конфигурациях, которые я не могу контролировать. Состоит из Vaadin для пользовательского интерфейса и в основном Tomcat (но не всегда) в качестве контейнера сервлетов.
Я столкнулся с проблемой, заключающейся в том, что IFrame, работающий внутри Word, добавляет нежелательный и искаженный _host_info к URL-адресу запроса, который содержит символы канала без 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-адресу, поскольку в файле манифеста надстройки я указываю только исходный URL-адрес, как показано ниже, и информация добавляется автоматически.
<SourceLocation DefaultValue="https://localhost:8443/myapp/ " />
Проверяя документацию, я не обнаружил такого поведения. там, так что я мог пропустить что-то. Запрос информации о хосте упоминается в этот пост в блоге, но кажется, что он не должен быть частью URL.
Можно ли запретить надстройке Office добавлять: ?_host_Info=Word|Win32|16.01|en-US HTTP/1.1 к запросу?
Если нет, есть ли правильный способ отфильтровать/игнорировать эту часть URL-адреса с помощью Tomcat? Поскольку все приложение работало правильно с моим веб-сервером Apache и бэкэндом Django, URL-адрес тоже был получен, но он работал.
Что касается второго вопроса, я уже пытался реализовать фильтр сервлета, который должен удалить рассматриваемый параметр. Но поскольку он использует ту же библиотеку 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 – 17 февраля:
С более поздними обновлениями Tomcat обходной путь, описанный выше, больше не подходит. Как отмечено в комментариях, версии 7.0.73, 8.0.39, 8.5.7 имеют более строгую политику URL. Поэтому нет решения использовать версии tomcat для размещения офисных надстроек без дополнительных инструментов. Я очень надеюсь, что эта ситуация скоро изменится, потому что такая маленькая, вероятно, бесполезная строка может использовать такие проблемы с развертыванием.