URL重定向:服务器端重定向到IE中的目录/文件夹

时间:2010-01-06 15:00:30

标签: internet-explorer browser servlets bit.ly

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

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

  1. 目标是一个目录(例如file:///N:/somefolder,其中N:是网络驱动器)
  2. 客户端浏览器是IE
  3. 对于Firefox,这很好用,目录列表在浏览器中显示,好像我在地址栏中键入了“file:///n:/somefolder”(我将我的服务器添加到Firefox的可信URI列表中)< / p>

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

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

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

    提前致谢!

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

由于安全限制,这是不可能的。如果服务器计算机也可以访问java.io级别的资源,那么您可以自己充当代理服务器。只需创建一个Servlet,使用InputStream获取FileInputStream,然后将其写入OutputStream的{​​{1}}以及一组正确的标题。

以下是这种servlet的HttpServletResponse的样子:

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) {} } url-pattern上,并使用/files/*进行调用。您可以找到here另一个基本示例。

答案 2 :(得分:0)

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

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

这需要用户点击一下,但是可以正常工作。