URL参数解码不工作



在我的java web应用程序中,我必须构造一个URL,然后调用URL。在创建URL时,我使用URLEncoder.encode("text","UTF-8")编码参数值,但是当我们在接收端获得参数并解码时-它没有正确解码。我尝试将编码值设置为请求属性,这很好。但不能按客户端请求使用

编写以下代码测试URLEncoder &URLDecoder和URLCodec来自Apache公共编解码器函数。

    StringBuffer sb = new StringBuffer("TestSpecialChar'` ~6 Æ æ  Ç  È  123");
    //String testCharacters = "TestSpecialChar'` ~6 Æ æ  Ç  È  123";
    String testCharacters = sb.toString();
    try {
        String encoded = URLEncoder.encode(testCharacters, "UTF-8");
        System.out.println("URLEncoder : " + encoded);
        System.out.println("URLDecoder : " + URLDecoder.decode(encoded, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    URLCodec urlc = new URLCodec("UTF-8");
    try {
        String encoded = urlc.encode(testCharacters);
        System.out.println("urlc.encode : " + encoded);
        System.out.println("urlc.decode : " + urlc.decode(encoded));            
    } catch (EncoderException ee){
        ee.printStackTrace();
    } catch (DecoderException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        String encoded = urlc.encode(testCharacters);
        System.out.println("urlc.encode : " + encoded);
        System.out.println("URLDecoder : " + URLDecoder.decode(encoded, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (EncoderException ee){
        ee.printStackTrace();
    }

这段代码工作得很完美。然后我编写了一个简单的web应用程序,其中有两个JSP页面,其中一个页面使用URL中的编码值调用另一个页面。这在接收端没有显示正确的解码值。以下是代码供您参考。

sender.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page language="java" import="java.net.URLEncoder"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sender</title>
<script type="text/javascript">
function send(){
window.location='<%=request.getContextPath()%>/jsp/receiver.jsp?txt=<%=URLEncoder.encode("TestSpecialChar'` ~6 Æ æ  Ç  È  123","UTF-8")%>';
}
</script>
</head>
<body onload="javascript:send();">
</body>
</html>

receiver.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page language="java" import="java.net.URLDecoder"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Receiver</title>
</head>
<body>
<% 
if (request.getAttribute("encoded") != null){
 URLDecoder.decode(request.getAttribute("encoded").toString(),"UTF-8"); 
}
if (request.getParameter("txt") != null){
%>
<%=URLDecoder.decode(request.getParameter("txt").toString(),"UTF-8")%>
inside if getparameter
<%
}
%>
</body>
</html>

我在浏览器中得到以下输出

TestSpecialChar' ' ~6 ÆôÇô123 inside if getparameter

代替

TestSpecialChar' ' ~6 Æ Æ Ç È 123 inside if getparameter

有人可以让我知道什么是错误的测试代码和什么是请求属性和参数之间的差异,由于属性被正确解码,而参数没有?

Temp solution:解决方法如下:1)创建一个类,用utf8代码替换一些特定的字符。2)删除了字符数据作为URL参数的传递。3)确保对外部URL的调用是UTF-8编码。4)从外部URL接收到的任何值,或者在应用程序中在使用该值之前被解码的任何值。

Correct solution:为了克服这个问题,应用程序的设计和编码必须考虑到i18n,所有JSP页面都使用UTF-8编码。

您的URL将文本编码为UTF-8,但是您的JSP页面中有这些声明:

<%@ page language="java" 
    contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
...
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

如果服务器将页面视为ISO-8859-1而不是UTF-8,则可能会干扰您的编码。将pageEncoding更改为UTF-8,看看是否可以解决您的问题。

最新更新