request和response的中文乱码问题

  

  request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符, 服务器获取到的请求参数的值是乱码;html

  response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;java

乱码产生的缘由:web

  无论是request乱码仍是response乱码,其实都是因为客户端(浏览器)跟服务器端采用的编码格式不一致形成的。浏览器

以request乱码为例:浏览器向服务器发送请求,由于浏览器与服务器之间的通讯实质上是socket流,因此要先将请求参数(字符)转换成字节,也就是编码过程,服务器接收到请求参数后进行解码(字节转字符),而后封装到request对象中。若是客户端的编码与服务器端的解码不统一,就会致使经过request获取到的请求参数的值是乱码。tomcat

解决乱码方式:

1、response乱码
    服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,若是浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。
    对于response乱码,只须要在服务器端指定一个编码字符集,而后通知浏览器按照这个字符集进行解码就能够了。有三种方式:
 
    方式1:response.setCharacterEncoding("utf-8”);//设置服务器端的编码,默认是ISO-8859-1;该方法必须在response.getWriter()以前进行设置
                 response.setHeader("contentType", "text/html; charset=utf-8”);//通知浏览器服务器发送的数据格式是text/html,并要求浏览器使用utf-8进行解码。
 
    方式2:response.setContentType("text/html;charset=utf-8”);//等同于response.setHeader("contentType", "text/html; charset=utf-8”);它其实会覆盖
      response.setCharacterEncoding("utf-8”) ,在开发中只须要设置response.setContentType("text/html;charset=utf-8”)就能够了。意思是通知浏览器服务器发送的数据                  格式是text/html,服务器采用utf-8编码,并要求浏览器使用utf-8进行解码。
 
    方式3:response.setCharacterEncoding("utf-8”);//设置服务器端的编码为utf-8
                 response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);//要求浏览器使用utf-8进行解码
               
 能够看出,第二种方式是最简便的,这也是咱们在开发中最常使用的方式。
 
2、request乱码
       从浏览器发起的访问方式有三种:在地址栏直接输入URL访问、点击页面中的超连接访问、提交表单访问。第一种访问方式浏览器默认将参数按照utf-8进行编码,后面两种访问方式浏览器将参数按照当前页面的显示编码进行编码。因此对于request乱码,只须要在服务器端设置相应的解码格式便可。因为访问方式不一样,浏览器对参数的编码格式也不一样,为了方便处理,经过超连接和表单的访问也规定必须是utf-8格式,即显示当前页面的编码也要使用utf-8,这样浏览器将统一使用utf-8对参数进行编码。
       在服务器端,经过request.setCharacterEncoding("utf-8”)便可设置服务器的解码为utf-8(默认是ISO-8859-1),可是它只对请求体里面的参数有效;若是参数跟在请求行中的uri后边,它就无能为力了。所以请求方式不一样,解决乱码的方案也不一样。
 
 一、post方式
          post方式属于表单提交,参数存在于请求体中,经过request.setCharacterEncoding("utf-8”)便可解决乱码。
   
 二、get方式
         get方式提交的参数会跟在请求行中的uri后边,服务器按照默认的iso-8859-1进行解码,这时候解决乱码有两种办法:
         办法一:修改服务器端对uri参数的默认编码
          在tomcat的server.xml中,设置<Connector ….>元素的属性URIEncoding="UTF-8”便可。(默认没有设置此属性)
         例如:<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8”/>
          注意:
    一、设置<Connector ….>元素的属性useBodyEncodingForURI=“true”,意思是请求体和uri使用相同的编码格式。
    经过设置这两个属性,既能够解决get方式的乱码,又能够解决     post方式的乱码。
    二、经过修改server.xml指定服务器对get和post统一按照utf-8解码,要求tomcat管理下的全部web应用都要使用utf-8编码,
    即全部的jsp、html页面都使用utf-8编码。好比 JSP页面的头信息是这样的:
 
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!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=utf-8"]]>
<title]]>Insert title here</title]]>
</head]]>
           办法二:逆向操做
                  参数从浏览器到服务器,通过客户端utf-8编码,服务器端iso-8859-1解码,最终成为乱码。那咱们将乱码进行相反的编解码,便可获得正常的参数值。
                例如:String name = request.getParameter("name”);//获得乱码    
                          name = new String(name.getBytes("iso-8859-1"),"utf-8”);//获得正常的name值(post和get都适用)
          注意:name.getBytes();若是不指定编码,默认按照gb2312进行编码。
相关文章
相关标签/搜索