Requset和Response中的乱码问题

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

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

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中的乱码问题已经解决了,有不足的地方,希望大家多多提意见!

时间: 2024-10-11 15:46:29

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

在FireFox/IE下Response中文文件名乱码问题解决方案

在FireFox/IE下Response中文文件名乱码问题解决方案 作者: 字体:[增加 减小] 类型:转载 只是针对没有空格和IE的情况下使用Response.AppendHeader()如果想在FireFox下输出没有编码的文件,并且IE下输出的文件名中空格不为+号,就要多一次判断了,接下来将详细介绍下感兴趣的朋友可以了解下,或许对你有所帮助 发现很多园子里的人在处理Response下载文件名是使用这个方法 Response.AppendHeader("Content-Disposition

web开发中的乱码问题

乱码问题的根源:(以web程序为例子,eclipse来查看编码,设置UTF-8) 解决方案:所有文件或者字符串的编码方式一致 (1)查看web页面文件的编码方式:        (2)web页面的<head>写上          <meta http-equiv="content-type" content="text/html; charset=UTF-8"> (3)特别注意web里面的<form>提交时submit,带有中文

Servlet------&gt;request和response控制编码乱码问题

我在request篇和response都有提到,觉得会忘记,所以从新整理一下 request细节四----->通过request控制编码问题 第一种方式是通过设置------>request.setCharacterEncoding("UTF-8")和URLEncoder.encode(username, "UTF-8");//只有post生效 第二种方式是通过设置------>(post,get通用的情况) String username=new

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

javaweb中的乱码问题 在初次接触javaweb中就遇到了乱码问题,下面是我遇到这些问题的解决办法 1. 页面乱码(jsp) 1. 在页面最前方加上 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2. 读取数据时乱码 (servlet) 1. 在request.getParameter("nam

Servlet中的乱码问题

form表单中的属性: accept-charset 属性允许您指定一系列字符集,服务器必须支持这些字符集,从而得以正确解释表单中的数据. form数据的编码是由如果是html文件则由<meta http-equiv="Content-Type" content="text/html;charset=utf-8">决定 如果是jsp文件则由<%@page contentType="text/html;charset=utf-8"

大开测试:性能—如何解决脚本中的乱码问题(连载7)

7.7  如何解决脚本中的乱码问题 1.问题提出 平时在对Web应用程序性能测试的时候,可能会出现录制的脚本中汉字变为乱字符的现象. 2.问题解答 在所有字符集中,最知名的可能要数被称为ASCII的7位字符集了.它是美国信息交换标准委员会(AmericanStandards Committee for Information Interchange)的缩写,为美国英语通信所设计.它由128个字符组成,包括大小写字母.数字0-9.标点符号.非打印字符(换行符.制表符等4个)以及控制字符(退格.响铃

mysql中中文乱码问题

作用:约束用来保证数据有效性和完整性 . 定义主键约束 主键约束 primary key : 信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键 (唯一 非空)   primary key:不允许为空,不允许重复 删除主键: alter table tablename drop primary key ; 主键自动增长 :auto_increment 定义唯一约束 unique    例如:name varchar(20) unique 定义非空约束   not null    例如

JSP页面中中文乱码问题

在编写Jsp页面的时候,发现写入其中的中文在浏览器浏览的时候会出现乱码的情况. 出现乱码的原因分析: 因为页面中对自己的编码格式的声明和页面的实际编码格式不相同,导致的,所以解决办法就是将页面中的声明的编码格式与页面的实际编码格式设为同一个编码. 这个问题可以这样解决: 首先,在页面顶端,用page指令声明此页的编码格式,比如通过contentType="text/html, utf-8"声明为utf-8格式. 其次,通过project->properties->resou

putty中查询乱码问题

我们在putty连接Linux时候,有时候查询会出现乱码问题...如下图 这个是因为putty中设置编码字符集的原因..将此换为utf8格式的即可解决 解决后查询如下: putty中查询乱码问题,布布扣,bubuko.com