GET和POST参数乱码
Posted 闲杂人等
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GET和POST参数乱码相关的知识,希望对你有一定的参考价值。
当表单用get()方式请求时,表单内的数据参数是通过URL路径传送到Servlet的,浏览器的传送编码方式是可以调的,
老版本的tomcat的默认解码方式是iso-8859-1方式,iso-8859-1这种方式时不支持中文的,这时会出现乱码的问题,我们可以将变量再转码成utf-8这样就不会再乱码:
String roleIdNew = new String(roleId.getBytes("iso-8859-1"),"UTF-8");
这个时候就出现了另外的一个问题 我们现在的tomcat版本有的时候不是用iso-8859-1的作为默认的编码方式 有的会用utf-8 这个时候我们就不知道服务器到底是适用的那一种编码方式,这个时候我们最好的解决办法是:在页面就对要传输的变量做一下编码 然后在后台我们用就知道用哪种方式进行解码了
例如:
页面:
function saveRole(roleId,roleName,flag) {
var roleIdNew = encodeURI(encodeURI(roleId));
var title = "角色" + (flag==0?"新增":"修改");
var url = \'/priv/goToAddRole.do?flag=\'+flag;
openDialog(350,300,\'new\',title,flag==0?url:url+\'&roleId=\'+roleIdNew,\'\');
}
encodeURI方法是将变量编码成UTF-8的形式 然后我们在后台就可以用UTF-8再解码就行了
后台:
@RequestMapping("/goToAddRole.do")
public ModelAndView goToAddRole() throws UnsupportedEncodingException {
ModelAndView mv = new ModelAndView("/newpages/priv/addRole");
String flag = request.getParameter("flag");//0:新增 1:修改
String roleId = request.getParameter("roleId");
if(StringUtil.isNotBlank(roleId)){
/*String roleIdNew = new String(roleId.getBytes("iso-8859-1"),"UTF-8");//中文乱码问题*/
String roleIdNew = URLDecoder.decode(roleId,"UTF-8");//中文乱码问题
mv.addObject("role",privRoleService.queryById(roleIdNew));
}
mv.addObject("flag",flag);
return mv;
}
我们发现在页面上我们进行了两次encodeURI方法来编码 以为我们的数据传递到后台的时候 tomcat会默认解码一次 如果编码一次的的话 还是可能出现乱码的问题,所以我们编码两次 这样tomcat自动解码的时候就会自动抵消一次 我们再解码就是正确的了
所以说表单最好是用post方式提交,而且这个时候,表单元素的传递是在HTTP信的正文中传送到Servlet的,这样比较安全。在post方式的乱码问题中可以这样解决,如果你想在Servlet中有这样的操作String name=req.getParameter("hello");或者有这样的操作System.out.println(req.getParameter("hello"));总之就是不进行out.write()操作,就在getParameter()方法之前加上一句req.setCharacterEncoding("utf-8");但是这个方法就只作用在post的HTTP信的正文,并且要放在getParameter()方法之前,如果你进行out.write()操作出现乱码,这个就是服务器往浏览器写信的时候出现了乱码,这个时候在out.write()之前加上
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");这两句话要配合使用。
(这一种方法是不推荐的,因为我们不可能去修改人家服务器上的编码方式,这个时候程序就会出错)其实还有一个比较全局的方法就是在服务器中进行配置,在Service的service.xml中的包含连接端口的那一句加上:
在上传文件的时候,通常要知道真是路径,通常要知道上传到磁盘上的哪一个文件,这个时候就用:
req就是request,括号中参数就是项目当前目录下的test文件夹,结果就是:
以上是关于GET和POST参数乱码的主要内容,如果未能解决你的问题,请参考以下文章