Браузер пытается разрешить эти ресурсы относительно текущего URI запроса (как вы видите в адресной строке браузера). Эти ресурсы, конечно же, не существуют в вашем общедоступном веб-контенте, поскольку вы, кажется, разместили их в пути к классам.
Чтобы решить эту проблему, вам действительно нужно проанализировать HTML и изменить все относящиеся к домену src
и / или href
атрибуты <a>
, <img>
, * 1009 Элементы *, <link>
, <script>
, <iframe>
и т. Д., Позволяющие им указывать сервлет, который направляет эти ресурсы из пути к классам в ответ HTTP.
Это немного работы, но Jsoup делает это легко. Вот пример, который предполагает, что ваш сервлет сопоставлен с шаблоном URL /proxy/*
.
String proxyURL = request.getContextPath() + "/proxy/";
InputStream input = MyServlet.class.getResourceAsStream("/a/b/resources" + request.getPathInfo());
if (request.getRequestURI().endsWith(".html")) { // A HTML page is been requested.
Document document = Jsoup.parse(input, "UTF-8", null);
for (Element element : document.select("[href]")) {
element.attr("href", proxyURL + element.attr("href"));
}
for (Element element : document.select("[src]")) {
element.attr("src", proxyURL + element.attr("src"));
}
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(document.html());
}
else { // Other resources like images, etc which have been proxied to this servlet.
response.setContentType(getServletContext().getMimeType(request.getPathInfo()));
OutputStream output = response.getOutputStream();
byte[] buffer = new byte[8192];
for (int length = 0; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
}
input.close();
Откройте его по http://yourdomain:yourport/contextname/proxy/test.html.