1

我正在实现一个 URL 缩短器,比如 bit.ly。为此,我有一个 Java servlet 后端,它response.redirect(targetURL)为每个重定向请求执行一次。

这适用于 HTTP 请求,但我遇到了file://协议问题。有问题的情况是这样的:

  1. 目标是一个目录(例如网络驱动器file:///N:/somefolder在哪里)N:
  2. 客户端浏览器是IE

对于 Firefox,这很好用,目录列表显示在浏览器中,就好像我file:///n:/somefolder在地址栏中输入了“”一样(并且我已将我的服务器添加到 Firefox 的受信任 URI 列表中)

对于 IE,如果我file:///n:/somefolder在浏览器中键入“”并按 Enter,它会打开一个新的资源管理器窗口。这是我在进行服务器端重定向时想要的确切行为,但这根本行不通。我收到“IE 无法打开...”错误。

这不可能吗?或者是否有一些类似于 Firefox 首选项的设置将我的服务器添加到“受信任”URL 列表中以进行重定向?

请注意,如果目标是一个文件,例如'file:///n:/somefolder/test.doc'这样可以正常工作,即使在 IE 中也是如此!

提前致谢!

4

3 回答 3

0

由于安全原因,应限制从远程资源到本地资源的重定向,但并非所有浏览器都正确执行此操作。

有关漏洞利用的示例,请参阅此公告,

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

于 2010-01-06T19:28:02.093 回答
0

好吧,我的问题没有得到任何令人满意的答案。我找到了一种在 IE 中重定向到目录时有效的解决方法:让您的服务器发送到目标的链接,而不是实际的重定向。例如,服务器发送表单的 html

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

这将需要用户额外点击,但会起作用。

于 2010-01-09T05:33:11.397 回答
0

由于安全限制,这是不可能的。如果服务器机器也可以在级别访问这些资源java.io,那么您可以自己充当某种代理。只需创建一个使用它的Servlet它,并将其与一组正确的标题一起写入。InputStreamFileInputStreamOutputStreamHttpServletResponse

下面是doGet()这样一个 servlet 的样子:

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) {}
}

将此 servlet 映射到url-patternlike/files/*并使用http://example.com/contextname/files/test.doc. 您可以在此处找到另一个基本示例。

于 2010-01-07T02:39:59.633 回答