Перенаправление URL: перенаправление на стороне сервера в каталог / папку в IE - PullRequest
1 голос
/ 06 января 2010

Я использую сокращение URL, например, bit.ly. Для этого у меня есть серверная часть Java-сервлета, которая делает response.redirect(targetURL) для каждого запроса перенаправления.

Это нормально работает для HTTP-запросов, но у меня проблема с file:// протоколами. Проблемный случай таков:

  1. Цель - это каталог (например, file:///N:/somefolder, где N: - сетевой диск)
  2. Клиентский браузер IE

Для Firefox это работает нормально, список каталогов отображается в браузере, как если бы я набрал 'file:///n:/somefolder' в адресной строке (и мой сервер был добавлен в список доверенных URI Firefox)

Для IE, если я наберу 'file:///n:/somefolder' в браузере и нажму Enter, откроется НОВОЕ окно проводника. Это именно то поведение, которое мне нужно, когда я делаю перенаправление на стороне сервера, но это просто не работает. Я получаю сообщение об ошибке "IE Cannot open ...".

Разве это не возможно? Или есть какие-то настройки, схожие с настройками Firefox, которые добавляют мой сервер в список «доверенных» URL для перенаправления?

Обратите внимание, что если целью является файл, такой как 'file:///n:/somefolder/test.doc', это прекрасно работает даже в IE!

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 07 января 2010

Это невозможно из-за ограничений безопасности. Если серверный компьютер также имеет доступ к этим ресурсам на уровне java.io, то вы можете просто выступать в качестве прокси-сервера самостоятельно. Просто создайте Servlet, который получает InputStream, используя FileInputStream и запишите его в OutputStream из HttpServletResponse вместе с правильным набором заголовков.

Вот как будет выглядеть doGet() такого сервлета:

String filename = request.getPathInfo();
File file = new File("n:/somefolder", filename);

response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength(file.length());

BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(new FileInputStream(file));
    output = new BufferedOutputStream(response.getOutputStream());

    byte[] buffer = new byte[1024];
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}

Отобразите этот сервлет на url-pattern как /files/* и назовите его с http://example.com/contextname/files/test.doc. Вы можете найти здесь другой базовый пример.

0 голосов
/ 09 января 2010

Ну, я не получил удовлетворительных ответов на мой вопрос. Я нашел обходной путь, который работает при перенаправлении в каталоги в IE: ваш сервер отправляет ссылку на цель, вместо фактического перенаправления. Например. сервер отправляет html вида

<a href="file:///N:/somefolder">click here</a>

Это потребует дополнительного клика от пользователя, но будет работать.

0 голосов
/ 06 января 2010

Перенаправление с удаленных на локальные ресурсы должно быть ограничено по соображениям безопасности, но не все браузеры применяют это правильно.

См. В этом бюллетене пример использования,

https://www.kb.cert.org/vuls/id/713878

...