2

我正在开发一个将唯一标识符作为输入的 servlet,如果可以在另一台服务器上找到文档,则返回文档或发送 302 Moved Temporarily 重定向。另一台服务器是一个带有 apache 的 linux 机器,并通过 webdav 公开文件。我无法控制这台服务器。

只要 URL 中没有特殊字符(德语变音符号),重定向就可以正常工作。

有问题的资源如下所示http://webfolder.company.com/projekt/übersicht.pdf 当我将此 URL 复制并粘贴到我的浏览器 (Chrome) 中时,我可以毫无问题地打开文件(变音符号保留在 URL 中)。

但是,当我从服务器端发送重定向时,URL 会被编码http://webfolder.company.com/projekt/%C3%BCbersicht.pdf,并且由于某些我不明白的原因,这会导致 404 - Not Found。

我的 servlet 实现从数据库(MySQL、UTF-8)获取 URL 并使用 HttpServletResponse.sendRedirect 方法。

response.sendRedirect(remoteRessource);

(remoteRessource 是一个字符串)。使用curl我可以看到已设置 Location 标头,但 Chrome(和 Firefox)将 URL 编码为http://webfolder.company.com/projekt/%C3%BCbersicht.pdf,这会导致 404 错误。

< HTTP/1.1 302 Moved Temporarily
< Date: Wed, 06 Mar 2013 20:50:16 GMT
< Server: Apache-Coyote/1.1
< Location: http://webfolder.company.com/projekt/übersicht.pdf
< Content-Type: text/html;charset=UTF-8
< Content-Length: 0
< Set-Cookie: JSESSIONID=FA670C0DDA55593368A3285F54894153; Path=/; HttpOnly
< Vary: Accept-Encoding

将重定向 URL 按原样提供给未以任何方式编码的浏览器的正确方法是什么?谢谢。

使固定

感谢 Julian Reschke 的回答,我发现了两台服务器使用的不同编码。我现在让 Java/URI 类处理编码并且一切正常。

URI uri = new URI(schema, host, path, null);
String location = uri.toASCIIString();
response.sendRedirect(location);
4

2 回答 2

3

一个可能的原因是运行 Apache+WebDAV 的服务器需要不同于 UTF.8 的编码。ISO-8859-1 可能吗?

于 2013-03-11T08:30:42.880 回答
0

您必须使用 i18n 包进行字符国际化,而不是发送本地化字符 [在这种情况下为德语变音符号]

看看http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.html 这就是你的情况

并浏览此处进行编码和此处进行解码

于 2013-03-10T21:36:31.870 回答