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

Http 正确编码的URL上的request.getParameter()失败,http,servlets,gwt,Http,Servlets,Gwt,在GWT中的HttpServletRequest中调用request.getParameter(“文件名”)时遇到问题。以下是我如何编码URL的代码: String sFile = URL.encodeQueryString( "°^!§$%()=`´' glassfish +~#'@€-_²³.pdf" ); String sURL = GWT.getModuleBaseURL() + "filehttpservice" // name of the httpservlet + "?f

在GWT中的HttpServletRequest中调用
request.getParameter(“文件名”)
时遇到问题。以下是我如何编码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方法时,我希望使用以下代码从其参数中提取文件名:

request.setCharacterEncoding( "UTF-8" );
String sFilename = request.getParameter( "filename" );
但收到的文件名是:

°^!§$%()=`´' glassfish +~#'@â¬-_²³.pdf
这是完全错误的


我已经搜索了很长一段时间,并尝试了几种解决方案,但它并没有改变什么。有人知道如何接收正确的文件名吗?

request.setCharacterEncoding(“UTF-8”)
doGet()
没有影响。在
doGet()

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

编辑 默认情况下,Java在
utf-16
中编码
String
。。因此,您必须将其转换为
utf-8


response.setHeader(“内容处置”,新字符串(“附件;文件名=\”+sUrlFilename+”.pdf“+”\”.getBytes(“utf-8”),“ISO-8859-1”)

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


以Tomcat为例,这是在
连接器
级别使用
URIEncoding
属性配置的。对于Jetty,可以使用
org.eclipse.Jetty.util.UrlEncoding.charset
系统属性设置该属性。

Ok,但如果使用
doPost
解码仍然失败。我得到了完全相同的错误文件名。看来这和这件事无关CharacterEncoding@N43`URLDecover.decode(新字符串(request.getParameter(“filename”).getBytes(“iso-8859-1”)),字符集(用于URL编码);`你可以在这里阅读更多,谢谢!现在我自己正确地解码了参数,但在响应中面临另一个问题:当我设置响应头
response.setHeader(“内容处置”,“附件;文件名=\”+sUrlFilename+”.pdf“+”\”)时其中sUrlFilename是正确的UTF-8文件名:
°^!§$%()=''glassfish+~#'@€-(3)
,内容类型为
application/pdf;charset=UTF-8
下载提示中的文件名显示
^!$%()='glassfish+~#'@-uzy.pdf
这也是不正确的。你知道怎么解决吗?(Oh和
response.setCharacterEncoding(“UTF-8”)
也被调用)@N43您正在连接
UTF-8
UTF-16
字符串。。默认情况下,Java在
utf-16
中编码
String
。。因此,您需要将整个字符串转换为
utf-8
。我已经更新了我的答案。由于某些原因,UTF-8中的字节编码不适合我。我使用
MimeUtility.encodeWord(sUrlFilename,“ISO-8859-1”,“Q”)。不过,非常感谢!让我开心:)