HttpServletRequest对象中请求乱码的问题

HttpServletRequest对象中请求乱码的问题

​ 由于现在的 request 属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置 request 中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。

乱码问题的出现

通过客户端发送请求给服务器,在控制台中输出服务器接收到的数据出现乱码问题

/*
没有设置任何编码格式的情况
*/
public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收参数
		String uname = request.getParameter("uname");
		String upwd = request.getParameter("upwd");
		//将接收到的结果输出到控制台
		System.out.println("账号:"+uname+"密码:"+upwd);
	}
}

GET提交方式时

参数在请求行里 默认使用ISO-8859-1

  • 服务器版本为Tomcat8.0及以上时,控制台输出可能不会出现乱码。

  • 服务器版本为Tomcat7.0及以下时,控制台输出出现乱码问题。

    万鲲 → GBK进行编码 → 1011 → 服务器默认通过ISO-8859-1进行解码 万鲲

POST提交方式时

参数在请求体里,使用页面编码

  • 所有版本都会出现乱码情况。

将服务器内容输出到客户端出现乱码问题

public class Servlet01 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//将内容输出到浏览器界面展示
		response.getWriter().write("你好,中国");
	}
	
}
  • 由于服务器和浏览器的编码字符集不同,所以出现乱码问题。

乱码问题的解决

GET提交方式

public class Servlet01 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收参数
		String uname = request.getParameter("uname");
		String upwd = request.getParameter("upwd");
		//万能解决方法
		String str = new String(uname.getBytes("ISO-8859-1"),"UTF-8");
		//将接收到的结果输出到控制台
		System.out.println("账号:"+str+"密码:"+upwd);
	}
}
  • String str = new String(uname.getBytes("ISO-8859-1"),"UTF-8");利用该方法将服务器接收到的内容(服务器将改内容转为“ISO-8859-1”了)以UTF-8进行解析。
  • 该方法也适用于POST请求。

POST提交方式

public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置服务器默认解码字符集  针对请求体  放在使用request对象之前
		request.setCharacterEncoding("UTF-8");
		//接收参数
		String uname = request.getParameter("uname");
		String upwd = request.getParameter("upwd");
		//将接收到的结果输出到控制台
		System.out.println("账号:"+uname+"密码:"+upwd);
	}	
}
  • POST请求方式时,在request对象之前设置服务器默认解码字符,使用request.setCharacterEncoding("UTF-8");进行设置。

将服务器内容输出到客户端

public class Servlet01 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置发送到客户端的响应的内容类型以及编码格式
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("

你好南昌china

"
); } }
  • 通过response.setContentType("text/html;charset=utf-8");设置发送到客户端的响应内容的类型以及编码格式,可以解决乱码问题。

你可能感兴趣的:(java中级)