360搜索怎么做网站自然优化,小说网站建设教程,如何作做网站,做电商需要什么条件前言
前面一篇文章我们探讨了 Servlet 中的 Request 对象#xff0c;Request 请求对象中封装了请求数据#xff0c;使用相应的 API 就可以获取请求参数。
【Servlet篇】一文带你读懂 Request 对象
也许有小伙伴已经发现了前面的方式获取请求参数时#xff0c;会出现中文乱…前言
前面一篇文章我们探讨了 Servlet 中的 Request 对象Request 请求对象中封装了请求数据使用相应的 API 就可以获取请求参数。
【Servlet篇】一文带你读懂 Request 对象
也许有小伙伴已经发现了前面的方式获取请求参数时会出现中文乱码的情况本文就是为了解决获取请求参数中文乱码的问题本文以 POST 请求方式和 GET 请求方式为例其他的请求方式类似这里不再赘述。
问题引入
第一步在 webapps 文件目录下创建 req.html 在 HTML 添加表单并且指定页面的请求方式为 get 。
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
bodyform action/servlet-project/demo methodgetinput typetext nameusernamebrinput typepassword namepasswordbrinput typecheckbox namehobby value1 游泳input typecheckbox namehobby value2 爬山 brinput typesubmit
/form
/body
/html第二步在 Servlet 获取参数并打印。
WebServlet(/demo)
public class ServletDemo extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username req.getParameter(username);System.out.println(username);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}第三步启动服务器在页面上输入中文。 第四步查看控制台输出 修改 form 表单中页面发送请求的方式为 post 继续上面的步骤进行验证。我们发现不管是 get 请求还是 post 请求在发送的请求中如果存在中文那么服务器接收到的数据都会出现中文乱码的情况具体该如何解决这个问题呢
POST请求的解决方案
出现中文乱码的情况的原因
在 post 请求方式中我们通过 request 对象的 getReader() 方法来获取流中的数据其中页面的编码方式为 UTF-8而 TomCat 在获取流的时候采取的是 ISO-8859-1 的编码方式而此方式是不支持中文的。由于编码和解码的方式不相同ISO-8859-1 编码方式不支持中文导致了控制台出现中文乱码的情况。
要想解决这个问题我们只需要将页面的编码方式和 TomCat 在获取流数据之前的编码方式都设置为 UTF-8。通过下面的方式设置 TomCat 获取流对象之前的编码方式
request.setCharacterEncoding(utf-8);示例
WebServlet(/demo)
public class ServletDemo extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.解决中文乱码的问题//设置编码方式为utf-8request.setCharacterEncoding(utf-8);String username request.getParameter(username);System.out.println(username);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}此时重新发送 post 请求就会在控制台正常展示中文结果。
我们已经解决了 post 请求中文乱码的问题但是这个方法不适用于 get 请求接下来我们探讨 get 请求中文乱码的解决方案。
GET请求的解决方案
在 post 请求方式中使用流的方式获取请求数据所以出现中文乱码后我们可以通过设置流的编码方式来解决但是这样的方式并不适用于 get 请求方式因为 get 请求使用的并不是流的方式来获取请求数据。get 请求方式获取数据
request.getQueryString();get 请求方式出现乱码的原因分析
浏览器通过 HTTP 协议发送请求和数据到服务器在这个过程中会对中文进行 URL 编码编码的方式为页面指定的 UTF-8服务器接收到这个编码的数据以后会按照 ISO-8859-1 的编码方式进行 URL 解码由于前后编码的方式不同导致了中文乱码。ISO-8859-1 本身是不支持中文的所以即使我们修改页面的编码方式为 ISO-8859-1 编码也不能解决中文乱码的问题。 那么什么是 URL 编码URL 解码呢我们如何解决 get 请求方式中文乱码的问题
URL 编码的大致过程是这样的首先将字符串按照编码的方式转换为二进制然后每个字节转换为 2 个 16 进制的数据并在前面加上 %。
示例将 张三 进行 URL 编码
第一步按照 UTF-8 的方式找到张三两个汉字对应的十进制并转换为二进制
1110 0101 1011 1100 1010 0000 1110 0100 1011 1000 1000 1001第二步每个字节转换为 2 为 16 进制数并且在前面加上 %
%E5%BC%A0%E4%B8%89Java 中提供编码和解码的 API 工具类让我们更加快速的进行编码和解码的操作。
编码
java.net.URLEncoder.encode(需要被编码的内容,字符集(UTF-8))解码
java.net.URLDecoder.decode(需要被解码的内容,字符集(UTF-8))知道了乱码产生的原因我们就来解决这个问题。 从上图可以看出不管使用哪一种字符集其对应的 %E5%BC%A0%E4%B8%89 都是相同的即二进制数据是相同的所以我们可以将乱码的数据转化为字节再把字节转换为正确的中文汉字在转换的过程中保证编码的一致这样就解决了中文乱么的问题。具体实现步骤为
获取乱码数据对应的二进制数组按照 UTF-8 的形式获取二进制数据对应的字符串
示例
public class URLDemo {public static void main(String[] args) throws UnsupportedEncodingException {String username 张三;//1. URL编码String encode URLEncoder.encode(username, utf-8);System.out.println(encode);//2. URL解码String decode URLDecoder.decode(encode, ISO-8859-1);System.out.println(decode); //此处打印的是对应的乱码数据//3. 转换为字节数据,编码byte[] bytes decode.getBytes(ISO-8859-1);for (byte b : bytes) {System.out.print(b );}//此处打印的是:-27 -68 -96 -28 -72 -119//4. 将字节数组转为字符串解码String s new String(bytes, utf-8);System.out.println(s); //此处打印的是张三}
}回到开始的问题解决 get 请求中请求参数的中文乱码问题
WebServlet(/demo)
public class ServletDemo extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username request.getParameter(username);System.out.println(解决乱码前username);byte[] bytes username.getBytes(StandardCharsets.ISO_8859_1);username new String(bytes, StandardCharsets.UTF_8);System.out.println(解决乱码后username);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}同样这种方式也适用于 post 请求方式解决中文乱码问题。
重点在 TomCat 8 以后get 请求方式的中文乱码的问题已经解决其解决的思路就是官方将解码的方式由原来的 ISO-8859-1 转换为 UTF-8。所以如果你的 Maven 坐标中配置的是 TomCat 8 以后的版本get 请求方式不再出现乱码。 你问我青春还剩几年我的回答是趁现在正当时。身边朋友都在问我怎样学好一门编程语言怎样学好Java怎样通过 Java 找到一份满意的工作推荐学习此专栏Java编程基础教程系列零基础小白搬砖逆袭
下期见。