Решение защищенных ресурсов с помощью летающей тарелки (Itextrenderer)
-
23-10-2019 - |
Вопрос
Я использую летающую тарелку для создания PDF из XHTML, размещенной на сервере Tomcat. Большинство изображений, включенных в PDF, доступны общедоступны (логотипы и т. Д.), Но некоторые из них защищены за логином (то есть они транслируются через сервлет, если пользователь вошел в систему).
Когда я вставляю URL -адрес в браузере, изображение, конечно, отображается нормально, потому что браузер отправляет сеанс с запросом. Но когда летающая тарелка отображает PDF, она не включает защищенное изображение, потому что он ничего не знает о сессии.
Итак, мой вопрос; Есть ли способ включить байтовые потоки для разрешения летающей тарелки, так же, как можно добавить разрешаемые шрифты? Я пробовал что -то вроде это, но нет простого способа установить UAC на itextrenderer, и он жаловался каждый раз, когда я пробовал.
Решение
Таким образом, вы можете установить UserAgeNcentCallback, и Flying Buster будет использовать его для разрешения URL -адресов (протестировано, работает с выпуском 8):
ITextRenderer renderer = new ITextRenderer();
renderer.getSharedContext().setUserAgentCallback(new MyUAC());
Myuac должен расширить NaiveUserAgent
, и переопределить resolveAndOpenStream
Метод, как предполагает другая страница.
Другие советы
Я также отменяю Itextuseragent - из источника, похоже, это то, что использует Itextrenderer. Вы должны предоставить выходное устройство в конструкторе, которое вы можете получить от объекта рендеринга. Еще одна Gotcha - это то, что вам нужно установить «общий контекст» явно, используя метод сеттера - в противном случае вы получите NPE во время рендеринга. Вот код для настройки объекта:
ITextRenderer renderer = new ITextRenderer();
MyUserAgentCallback uac = new MyUserAgentCallback(renderer.getOutputDevice());
uac.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(uac);
Кроме того, вот основная идея myuseragentcallback, используя базовую аутентификацию:
private static class MyUserAgentCallback extends ITextUserAgent
{
public MyUserAgentCallback(ITextOutputDevice outputDevice)
{
super(outputDevice);
}
@Override
protected InputStream resolveAndOpenStream(String uri)
{
if (_isProtectedResource(uri))
{
java.io.InputStream is = null;
uri = resolveURI(uri);
try {
URL url = new URL(uri);
String encoding = new BASE64Encoder().encode ("username:password".getBytes());
URLConnection uc = url.openConnection();
uc.setRequestProperty ("Authorization", "Basic " + encoding);
is = uc.getInputStream();
Log.debug("got input stream");
}
catch (java.net.MalformedURLException e) {
Log.error("bad URL given: " + uri, e);
}
catch (java.io.FileNotFoundException e) {
Log.error("item at URI " + uri + " not found");
}
catch (java.io.IOException e) {
Log.error("IO problem for " + uri, e);
}
return is;
}
else
{
return super.resolveAndOpenStream(uri);
}
}
private boolean _isProtectedResource(String uri)
{
// does this require authentication?
}
}