您的位置:首页 > 编程语言 > Java开发

工作总结之----前后台传输中文或者特殊字符的处理

2018-02-26 15:31 477 查看

1.ajax传参数,使用ajax传递参数时尽量不要把参数拼接到URL后面,要尽量使用data进行参数传输,可以避免中文乱码和特殊字符传输的问题:
例子:
$.ajax({
    url: "/zoneLogs/deletePower",
    data: {id:id,permiType:permiType},
    type: "post",
    dataType: "json",
    success: function (data) {},
    error: function () {}
});
2.js前台进行编码,java后台进行解码:
例子:
js:
//点击详情
function associated2() {
    var rows = grid.getSelected();
    var objId = rows.OBJID;
    var name = rows.NAME;
    var url = "/chat/groupPersonList?objId=" + objId+"&name="+encodeURI(encodeURI((name)));
    window.location.href = url;
}
java:
/**
 * 跳转组员列表页面
 * @return
 */
@RequestMapping(value = "/groupPersonList")
public String groupPersonList(HttpServletRequest request) throws UnsupportedEncodingException {
    String id = request.getParameter("objId");
    String name = URLDecoder.decode(request.getParameter("name"),"UTF-8");
    request.setAttribute("id",id);
    request.setAttribute("groupName",name);
    return "/manage/chat/groupPersonList";
}
3.jsp中EL表达式编码一次,java后台无需解码:
例子:
jsp:
<c:set scope="request" var="fnRe" value="${list[0].fileName}"></c:set>
<p>文件名称:<a href="/zoneLogs/downloadFile?fileName=<%=java.net.URLEncoder.encode(request.getAttribute("fnRe")+"","UTF-8")%>&filePath=${list[0].filePath}">${list[0].fileName}</a></p>
java:
@RequestMapping(value="/downloadFile")
    public void downloadFile(HttpServletRequest request, HttpServletResponse response) {
        try{
            String filePath = request.getParameter("filePath");
            String fileName = request.getParameter("fileName");
            File f = new File(filePath);
            if(!f.exists()){
                f.createNewFile();
            }
            BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
            byte[] buf = new byte[1024];
            int len = 0;
            response.reset();
            response.setContentType("application/x-msdownload");
            response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
            OutputStream out=response.getOutputStream();
            while ((len = br.read(buf))>0){
                out.write(buf,0,len);
            }
            out.flush();
            br.close();
            out.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
对于前台编码两次后台解码一次解释(引用 http://blog.csdn.net/kongqz/article/details/9028111):
因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParameter();方法的时候使用服务器指定的编码格式自动解码一次,所以前台编码一次后台解码一次而解码和编码的方式不用所以造成了乱码的出现。
String name=java.net.URLEncoder.encode("测试", "UTF-8");
System.out.println(name);
System.out.println(java.net.URLDecoder.decode(name, "ISO-8859-1"));
编码后的是%E6%B5%8B%E8%AF%95。。
而用ISO-8859-1解码后的是???è?。。
但是如果调用的是
System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));
则结果是打印“测试”。
使用两次编码的过程相当于如下代码:
 
String name=java.net.URLEncoder.encode("测试", "UTF-8");
System.out.println(name);
name=java.net.URLEncoder.encode(name,"UTF-8");
System.out.println(name);
name=java.net.URLDecoder.decode(name, "UTF-8");
System.out.println(name);
System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));
输出为:
            %E6%B5%8B%E8%AF%95
            %25E6%25B5%258B%25E8%25AF%2595
            %E6%B5%8B%E8%AF%95
            测试
第一次编码后将汉字编码为%和字母数字的格式,而第二次编码的时候是对%字母数字进行编码,虽然解码的时候使用的是ISO-8859-1,但是对于%和字母数字而言用ISO-8859-1和UTF-8解码出来的是一样的,此时就回到了汉字被编码过一次的字符串了,当再次进行解码的时候使用UTF-8就回将它转会汉字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jsp js 乱码