request.getParameter()在正确编码的URL上失败

时间:2014-11-21 12:36:03

标签: http servlets gwt

我在GWT中的HttpServletRequest中调用request.getParameter( "filename" )时遇到了问题。以下是我对URL进行编码的代码:

String sFile = URL.encodeQueryString( "°^!§$%()=`´' glassfish +~#'@€-_²³.pdf" );
String sURL = GWT.getModuleBaseURL() + "filehttpservice" // name of the httpservlet
    + "?filename=" + sFile; // the name of the file to download
Window.open( sURL, "_blank", sFeatures ); // sFeatures are some window-settings

所以我想下载一个名字中带有一些特殊字符的文件。 URL编码的名称是:

%C2%B0%5E!%C2%A7%24%25()%3D%60%C2%B4'%20glassfish%20%2B~%23'%40%E2%82%AC-_%C2%B2%C2%B3.pdf

这是正确的,因为我可以直接在浏览器中使用此名称调用该文件。

因此,当请求到达HttpServlet的get-Method时,我想使用以下代码从其参数中提取文件名:

request.setCharacterEncoding( "UTF-8" );
String sFilename = request.getParameter( "filename" );

但收到的文件名是:

°^!§$%()=`´' glassfish +~#'@â¬-_²³.pdf

这是完全错误的。

我已经搜索了很长时间并尝试了几个解决方案,但它没有任何改变。有没有人知道我怎么能收到正确的文件名?

2 个答案:

答案 0 :(得分:0)

request.setCharacterEncoding( "UTF-8" );doGet()没有影响。在doGet()中,queryString在到达doGet()之前被容器解析。

您应该使用doPostrequest.getInputStream()并自己解析queryString。并且不要在request.getParameter()之前使用request.getInputStream(),否则它将无效。

修改 默认情况下,Java会在String中对utf-16进行编码。因此您必须将其转换为utf-8

response.setHeader( "Content-Disposition", new String("attachment; filename=\"" + sUrlFilename + ".pdf" + "\"".getBytes("utf-8"),"ISO-8859-1") );

答案 1 :(得分:0)

正如Anurag Anand所说,这是一个编码问题;您必须配置您的servlet容器以将URL解码为UTF-8。

以Tomcat为例,这是使用Connector属性在URIEncoding级别配置的。使用Jetty,可以使用org.eclipse.jetty.util.UrlEncoding.charset系统属性设置。