【问题标题】:Problem in decoding parameters in get method, JSP在get方法,JSP中解码参数的问题
【发布时间】:2011-05-12 15:09:18
【问题描述】:

这里是如何调用jsp页面的。

eventMap.jsp?venue=%C4%B0ndigo

这是 eventMap.jsp 中我获取场地参数的行:

var venue="<%= URLDecoder.decode(request.getParameter("venue"),"UTF-8") %>";

不幸的是,这是最终 javascript 中的结果:

var venue="İndigo"; 

如何在 jsp 页面中正确使用编码以正确获取解码值 (İngido)。

编辑: 整个 eventMap.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.net.URLDecoder"%>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Event on Map></title>
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" charset="UTF-8">
  function initialize() {
    <% request.setCharacterEncoding("UTF-8"); %> 
    var lat=<%= request.getParameter("lat") %>;
    var lng=<%= request.getParameter("lng") %>;
    var venue="<%= URLDecoder.decode(request.getParameter("venue"),"UTF-8") %>";

    var myLatlng = new google.maps.LatLng(lat,lng);
    var myOptions = {
      zoom: 15,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    var marker = new google.maps.Marker({
        position: myLatlng, 
        map: map,
        title:"Hello"
    });   

    var infowindow = new google.maps.InfoWindow({ content: venue, size: new google.maps.Size(50,50)});
        google.maps.event.addListener(marker, 'click', function() {
        infowindow.open(map,marker);
    });

  }
</script>
</head>
<body onload="initialize()">
  <div id="map_canvas"></div>
</body>

</html>

萤火虫结果:

<!DOCTYPE html>
2
3
4<html>
5<head>
6<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
7<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
8<title>Event on Map</title>
9<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" />
10<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
11<script type="text/javascript" charset="UTF-8">
12 function initialize() {
13 var lat=41.062786;
14 var lng=28.981934;
15 var venue="İTà Kültür Sanat BirliÄi (KSB) Binası Küçük Salon (Maslak)";
16
17 var myLatlng = new google.maps.LatLng(lat,lng);
18 var myOptions = {
19 zoom: 15,
20 center: myLatlng,
21 mapTypeId: google.maps.MapTypeId.ROADMAP
22 }
23 var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
24
25 var marker = new google.maps.Marker({
26 position: myLatlng,
27 map: map,
28 title:"Hello"
29 });
30
31 var infowindow = new google.maps.InfoWindow({ content: venue, size: new google.maps.Size(50,50)});
32 google.maps.event.addListener(marker, 'click', function() {
33 infowindow.open(map,marker);
34 });
35
36 }
37</script>
38</head>
39<body onload="initialize()">
40 <div id="map_canvas"></div>
41</body>
42
43</html> 

【问题讨论】:

    标签: javascript jsp unicode character-encoding get


    【解决方案1】:

    GET 查询字符串的解码由 servletcontainer 处理,而不是由 Servlet API。目前还不清楚您使用的是哪个 servletcontainer,所以我无法给出详细的答案。例如在 Tomcat 中,它是 /conf/server.xml&lt;Connector&gt; 元素中的 URIEncoding 属性的 configureable

    <Connector URIEncoding="UTF-8">
    

    其他 servlet 容器中的配置类似。

    然后您可以删除不必要的URLDecoder 行。 getParameter() 已经返回了解码后的参数。

    另见:


    与实际问题无关,强烈建议将scriptlets换成EL,使用JSTLfn:escapeXml防止XSS攻击。

    var lat = ${fn:escapeXml(param.lat)};
    var lng = ${fn:escapeXml(param.lng)};
    var venue = "${fn:escapeXml(param.venue)}";
    

    另见:

    【讨论】:

    • 是的,现在可以了,但是如果我无法访问服务器配置文件怎么办?
    • 确保您选择/选择了具有良好支持的体面的主机,并告知它是否设置为 UTF-8。否则,您必须借助 FilterHttpServletRequestWrapper 手动解析 request.getQueryString() 来破解它。
    【解决方案2】:

    您的 JSP 标头是什么样的?

    确保它显示如下内容:

    <%@ page contentType="text/xhtml;charset=UTF-8"%>
    

    您还可以检查调用 JSP 时获得的 HTTP 标头。确保您的响应采用 UTF-8 编码。

    【讨论】:

    • 您是否尝试过 FIREBUG 访问您的 JSP? 编码是什么样的?
    • 关键是pageEncoding属性,而不是contentType属性。
    【解决方案3】:

    也许这个方法覆盖了错误的编码: request.setCharacterEncoding("UTF-8")

    您可能应该检查要在 JSP 标头或请求标头中使用的编码。

    查理

    【讨论】:

    • 这仅适用于请求正文中的 POST 查询字符串,不适用于请求 URL 中的 GET 查询字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多