带有重定向的URL编码(变音符号)(302暂时移动)

时间:2013-03-10 21:16:05

标签: java http servlets redirect

我正在研究一个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是一个String)。使用curl我可以看到正在设置位置标头,但Chrome(和Firefox)会将网址编码为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);

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您必须使用i18n软件包进行字符国际化,而不是发送本地化字符[在本例中为德语变音符号]

查看http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.html 这就是你案件中发生的事情

浏览here进行编码,浏览here进行解码