我正在实现像bit.ly这样的URL缩短器。为此,我有一个Java servlet后端,它为每个重定向请求执行response.redirect(targetURL)
。
这适用于HTTP请求,但我遇到了file://
协议的问题。有问题的案例是:
file:///N:/somefolder
,其中N:
是网络驱动器)对于Firefox,这很好用,目录列表在浏览器中显示,好像我在地址栏中键入了“file:///n:/somefolder
”(我将我的服务器添加到Firefox的可信URI列表中)< / p>
对于IE,如果我在浏览器中输入“file:///n:/somefolder
”并按Enter键,则会打开一个新的资源管理器窗口。当我进行服务器端重定向时,这是我想要的确切行为,但这根本不起作用。我得到“IE无法打开...”错误。
这不可能吗?或者是否有一些设置类似于Firefox首选项,它将我的服务器添加到“可信”URL列表中以进行重定向?
请注意,如果目标是文件,例如'file:///n:/somefolder/test.doc'
,即使在IE中也可以正常工作!
提前致谢!
答案 0 :(得分:0)
答案 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>
这需要用户点击一下,但是可以正常工作。