在我们的日常开发中,乱码问题,还是比较经常遇到的,有时候是浏览器端提交的数据到后台乱码了,有时候是后台响应的数据到前台浏览器端展现出现乱码了。下面我们将通过几个简单的例子来说明乱码的由来和解决方式。

一、前台提交的数据到后端乱码了

1.前台采用post方式提交,后端乱码

①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>
<body>
<form action="encode.do" method="post">
用户名:<input type="text" name="username" /> <input type="submit" value="提交" />
</form>
</body>
</html>

②后端接受参数的代码

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/encode.do")
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取前台提交的数据
String username = request.getParameter("username");
// 打印输出
System.out.println(username);
}
}

③运行结果

当我们从前台输入中文数据的时候,就会出现乱码了"??????"

④乱码原因:jsp页面的<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>说明了页面的编码是UTF-8和<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">这句话告诉浏览器以UTF-8的方式打开我们的jsp页面,当我们在页面的输入框中填写中文表单数据并提交的时候,会先去查询utf-8的码表对应中文在utf-8的编码值,因为tomcat服务器的默认编码是ISO-8859-1,当我们从后端通过request.getParameter("username")去获取参数的时候,就会拿着我们刚才utf-8的编码值去ISO-8859-1查询对应的字符,而在ISO-8859-1的码表没有这个编码指,所以就出现了???乱码了。

⑤解决乱码的方式:因为浏览器提交的数据是以utf-8进行编码的,所以我们可以通过改变request对象查询的码表改成和浏览器端的编码一致即可解决乱码问题。具体代码如下所示

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/encode.do")
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置request的编码和前台页面的编码保持一致utf-8
request.setCharacterEncoding("utf-8");
// 获取前台提交的数据
String username = request.getParameter("username");
// 打印输出
System.out.println(username);
}
}

2.前台采用get方式提交,后端乱码(哪怕修改了request的编码和页面的编码保持一致,也不行)

①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>
<body>
<form action="encode.do" method="get">
用户名:<input type="text" name="username" /> <input type="submit" value="提交" />
</form>
</body>
</html>

②后端接受参数的代码

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/encode.do")
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取前台提交的数据
String username = request.getParameter("username");
// 打印输出
System.out.println(username);
} }

③运行结果

当我们从前台输入中文数据的时候,就会出现乱码了"??????"

④乱码原因:jsp页面的<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>说明了页面的编码是UTF-8和<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">这句话告诉浏览器以UTF-8的方式打开我们的jsp页面,当我们在页面的输入框中填写中文表单数据并提交的时候,会先去查询utf-8的码表对应中文在utf-8的编码值,因为tomcat服务器的默认编码是ISO-8859-1,当我们从后端通过request.getParameter("username")去获取参数的时候,就会拿着我们刚才utf-8的编码值去ISO-8859-1查询对应的字符,而在ISO-8859-1的码表没有这个编码指,所以就出现了???乱码了。

⑤解决乱码的方式:因为浏览器提交的数据是以utf-8进行编码的,但是我们通过改变request对象查询的码表改成和浏览器端的编码一致依然不能解决乱码问题,这时候我们可以修改tomcat的server.xml中的编码保持和前端页面保持一致即可,就是在Connector标签上加上URIEncoding="前端页面的编码",代码如下:

 <Connector connectionTimeout="20000" port="8080" URIEncoding="UTF-8"  protocol="HTTP/1.1" redirectPort="8443"/>

3.一个既能够解决get方式乱码,又能解决post方式乱码的方式如下,就是反向编码,获取原来的编码值,在用这个编码值查询正确的码表即可获取正确的字符了。

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/encode.do")
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取前台提交的数据
String username = request.getParameter("username");
//对获取的数据进行方向编码,获取原来的编码值,在查询新码表
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
// 打印输出
System.out.println(username);
}
}

4.总结:

①对于get的方式的乱码我们一般都是通过修改tomcat的server.xml的方式来进行处理的。

②对于post方式的乱码,我们一般都是采用request.setCharacterEncoding的方式来处理的。

二、后端提交的数据到前端乱码了

1.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>
<body>
<form action="/JavaWebDemo/encode.do" method="post">
<input type="submit" value="get提交" />
</form>
<form action="/JavaWebDemo/encode.do" method="get">
<input type="submit" value="post提交" />
</form>
</body>
</html>

2.后端响应,并返回数据代码

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/encode.do")
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 返回数据
response.getWriter().print("还是放松放松放松放松");
} protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 返回数据
response.getWriter().print("还是放松放松放松放松");
} }

3.运行结果

结果返现,返回的数据乱码了。

4.乱码问题分析:我们后端返回数据是通过response对象获取相关的流对象,然后将数据返回,但是后端的数据采用的编码方式ISO-8859-1,而前台页面我们没有指定使用什么编码,他默认会采用本地机器的浏览器使用编码去打开,自然会报错。

5乱码结果方法:我们可以设置http的返回头的contenttype的内容来解决乱码问题,具体事例代码如下:

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/encode.do")
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(response.getCharacterEncoding());
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
// 返回数据
response.getWriter().print("还是放松放松放松放松");
} protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setHeader("CONTENTTYPE", "text/html;charset=gbk");
response.setCharacterEncoding("gbk");
// 返回数据
response.getWriter().print("还是放松放松放松放松");
} }

至此,关于servlet中request和response中的乱码问题已经解决了,有不足的地方,希望大家多多提意见!

Requset和Response中的乱码问题的更多相关文章

  1. Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码

    请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...

  2. Fiddler中Response 的Raw乱码问题解决

    有时候我们看到Response中的HTML是乱码的, 这是因为HTML被压缩了, 我们可以通过两种方法去解压缩. 1. 点击Response Raw上方的"Response body is ...

  3. Servlet中response、request乱码问题解决

    Java Web(二) Servlet中response.request乱码问题解决   三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现 ...

  4. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  5. javaweb中的乱码问题(初次接触时写)

    javaweb中的乱码问题 在初次接触javaweb中就遇到了乱码问题,下面是我遇到这些问题的解决办法 1. 页面乱码(jsp) 1. 在页面最前方加上 <%@ page language=&q ...

  6. javaweb中的乱码问题

    0.为什么需要编码,解码, 无论是图片,文档,声音,在网络IO,磁盘io中都是以字节流的方式存在及传递的,但是我们拿到字节流怎么解析呢?这句话就涉及了编码,解码两个过程,从字符数据转化为字节数据就是编 ...

  7. java中避免乱码

    response.setContentType("text/html;charset=UTF-8"); 这个是在action中的 这个是在json中设置乱码的 contentTyp ...

  8. Servlet------>request和response控制编码乱码问题

    我在request篇和response都有提到,觉得会忘记,所以从新整理一下 request细节四----->通过request控制编码问题 第一种方式是通过设置------>reques ...

  9. Java编程中中文乱码问题的研究及解决方案

    0 引言 Java最大的特性是与平台的无关性及开发环境的多样性.字符串被Java应用程序转化之前,是根据操作系统默认的编码方式编码.Java语言内部采用Unicode编码,它是定长双字节编码,即任何符 ...

随机推荐

  1. sql查看所有表大小的方法

    sql查看所有表大小的方法. 代码: declare @id int ) declare @pages int declare @dbname sysname ,) ,) ,) create tabl ...

  2. etcd+calico集群的部署

    etcd单机模式 设置环境变量 1 export HostIP="192.168.12.50" 执行如下命令,打开etcd的客户端连接端口4001和2379.etcd互联端口238 ...

  3. node js 调试出现同一个端口启动多次报错处理方案 Error: listen EADDRINUSE

    windows 下 1.查询端口占用的进程ID: netstat -aon | findstr "80"    80为端口号, 输出为: TCP    0.0.0.0:3000   ...

  4. Unix系统编程()检查进程的存在

    检查进程的存在 kill系统调用还有另一重功用.若将参数sig指定为0(即所谓空信号),则无信号发送. 相反,kill仅会去执行错误检查,查看是否可以向目标进程发送信号. 从另一角度来看,这意味着,可 ...

  5. repcached与mysql缓存測试

    使用gem安装mysql引擎 gem install mysql(假设安装失败.请查找一些依赖组建是否安装,比如mysql-devel) 编写ruby脚本,先获取mysql数据,之后从memcache ...

  6. EF应用一:Code First模式

    EF的核心程序集位于System.Data.Entity.dll和System.Data.EntityFramework.dll中.支持CodeFirst的位于EntityFramework.dll中 ...

  7. shell向python传参数

    想要在shell中调用python脚本时实现: python pyServer.py argu1 argu2 argu3 利用 sys.argv 即可读取到 相应参数: # coding=utf-8 ...

  8. mac环境搭建selenium

    前言 搭建python+selenium,mac自带python2.7,需要公司使用的python是3.x,可以自己百度安装python环境. 1. selenium安装 1. selenium的安装 ...

  9. 30Mybatis_mybatis和spring整合-原始dao开发

    这篇文章很重要, 第一步:我们讲一下整合的思路: 我们以前要用Mybatis是需要sqlMapConfig.xml(这个配置文件需要配置dataource,以及mapper.xml文件.)sqlMap ...

  10. C#三种模拟自动登录和提交POST信息的实现方法【转】

    网页自动登录(提交Post内容)的用途很多,如验证身份.程序升级.网络投票等,以下是用C#实现的方法.       网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以 ...