前言

在WEB开发的过程中,中文乱码是最为常见的问题之一。之所以会出现中文乱码的情况,主要原因是:前端使用POST或者GET方法传递的参数一般使用浏览器预先设置的编码方式进行编码,中文浏览器一般是使用UTF8或者GBK,英文的一般是ISO编码;而浏览器编码完成后发送给服务器,服务器进行解码的解码方式默认是使用ISO8859-1。这就造成了编码和解码方式不统一的,进而出现了中文乱码的问题。

在下面,我将给出分别对POST、GET方法乱码的解决方案

对POST方法和GET方法的简介

POST方法和GET方法是前端将表单中的内容提交到服务器端的方法,二者有着很大的不同之处。

首先,GET方法是直接把表单中的内容直接放在了URL中进行传值,就像这种:



可以很明显的看到,使用这种方式进行传参是对用户可见的,这就有了一定的安全隐患,所以,一般这种方法都不会用在对安全性有要求的地方。

其次,POST方法就相对安很多了,POST方法会将参数放入HTTP请求报文的实体部分,对用户来讲是不可见的。

对于HTTP的介绍,我今后会写一篇详细的博客来为大家讲解,细数HTTP协议的相关内容,敬请期待。

解决方案

POST方法

对于POST方法,解决起来相对简单。只需要在读取参数之前设置一下解码的的格式就行了。代码示例如下:

public class LoginServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response){
//将解码格式设置成UTF8
request.setCharacterEncoding("utf8");
String username = request.getParameter("username");
}
}

GET方法

而对于GET方法,就是比较麻烦的了。

第一种方案是,拿到所有的从前端传递过来的参数,进行统一编码,然后是用正则表达式,字符串的split函数split(“&”)进行切割,切割完成后,再分别取出参数值。

//取出所有的参数
String allParameters = request.getQueryString();
//对参数重新编码
String parameters = java.net.URLDecoder.decode(allParameters,"UTF-8");
//正则分割
String[] parameter = parameters.split("&");

第二种方案就更麻烦了。

首先要做的是获取到请求的参数值,然后对这个参数值使用ISO-8859-1的格式分解成字节数组,然后再重新生成为一个编码格式是UTF8的字符串。

//获取参数值
String name = request.getParameter("name");
//把参数值变成字节数组
byte[] nameBytes = name.getBytes("ISO-8859-1");
//生成新的编码为UTF8的字符串
String newName = new String(nameBytes,"UTF-8");

使用过滤器Filter

很明显,如果我的服务端有着大量的Servlet,这样的做法会造成大量的代码重复,显然是不满足代码复用的要求的,于是我们选择使用过滤器,对请求进行过滤。

下面的这个文件是对两种请求方式的编码与解码。

EncodingRequest.java

public class EncodingRequest extends HttpServletRequestWrapper {
private String charset;
public EncodingRequest(HttpServletRequest request, String charset) {
super(request);
this.charset = charset;
} public String getParameter(String name) {
HttpServletRequest request = (HttpServletRequest) getRequest(); String method = request.getMethod();
if(method.equalsIgnoreCase("post")) {
try {
request.setCharacterEncoding(charset);
} catch (UnsupportedEncodingException e) {}
} else if(method.equalsIgnoreCase("get")) {
String value = request.getParameter(name);
try {
value = new String(name.getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
}
return value;
}
return request.getParameter(name);
}
}

这个文件是过滤器,将所有请求都进行过滤。

public class EncodingFilter extends HttpFilter {
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
String charset = this.getInitParameter("charset");
if(charset == null || charset.isEmpty()) {
charset = "UTF-8";
}
response.setCharacterEncoding(charset);
response.setContentType("text/html;charset=" + charset);
EncodingRequest res = new EncodingRequest(request, charset);
chain.doFilter(res, response);
}
}

最后,为了让过滤器工作,配置一下web.xml文件

<filter>
<filter-name>EncodingFilter</filter-name>
<!--包名及文件名-->
<filter-class>cn.roobtyan.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

做完如上工作,乱码就解决了。

结语

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗

邮箱:roobtyan@outlook.com

个人博客:http://roobtyan.cn

扫描下面的二维码关注我吧,你将收获到意想不到的东西哟……

给大家准备了一份非常棒的JAVA的视频教程,从JAVA基础一直到JAVAWEB,还有非常强大的项目实战。

就在我的微信公众号里,回复java就可查看,免费的呦!

POST和GET方法乱码解决方案的更多相关文章

  1. IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

    IntelliJ IDEA 乱码解决方案 (项目代码.控制台等) 最近IDE从eclipse改成IntelliJ IDEA 了,原因是公司大部分人都在用这个IDE,而且一直推荐用,所以尝尝鲜.换的第一 ...

  2. JSP中pageEncoding和charset区别,中文乱码解决方案(转载)

    转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...

  3. css中文字体乱码解决方案

    css中文字体乱码解决方案:把css编码和html页面编码统一起来.如果html页面是utf-8.css.js也统一成utf-8编码.还有一个避免中文乱码的办法就是把中文字体写成英文来表示 css中文 ...

  4. Intellij Idea乱码解决方案

    使用Intellij Idea经常遇到的三种乱码问题: 1.工程代码乱码 2.main方法运行,控制台乱码 3.tomcat运行,控制台乱码 解决方案: 1.工程代码乱码 Settings > ...

  5. 【转】git乱码解决方案汇总

    git乱码解决方案汇 2012-11-04更新:官方的“终极”解决方案:msysGit1.7.10开始使用UTF-8编码保存文件名. 2011-10-24更新: 从一篇链接到本篇文章的文章(我对这篇文 ...

  6. JMeter:全面的乱码解决方案【转】

    本文是转自https://www.cnblogs.com/mawenqiangios/p/7918583.html 感谢分享者   中文乱码一直都是比较让人棘手的问题,我们在使用Jmeter的过程中, ...

  7. C#.net地址传参汉字乱码解决方案

    C#.net地址传参汉字乱码解决方案   web.config文件: <system.web> <globalization requestEncoding="GB2312 ...

  8. (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全

    JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...

  9. Hive中文注释乱码解决方案(2)

    本文来自网易云社区 作者:王潘安 执行阶段 launchTask    回到Driver类的runInternal方法,看以下执行过程.在runInternal方法中,执行过程调用了execute方法 ...

随机推荐

  1. pytorch & numpy广播法则

    广播法则 所有数组向维度最高的数组看齐,若维度不足则在最前面的维度用1补齐 扩展维度后,所有数组在某一维度相同或者长度为1,否则不能计算 当可以计算时,将长度为1的维度扩展为另一数组相应维度的长度 a ...

  2. 第2节 网站点击流项目(下):6、访客visit分析

    0: jdbc:hive2://node03:10000> select * from ods_click_stream_visit limit 2;+--------------------- ...

  3. 《新标准C++程序设计》4.5(C++学习笔记15)

    实例:长度可变的整型数组类 int main() { //要编写可变长整型数组类,使之能如下使用: CArray a; //开始里的数组是空的 ; i < ; ++i) a.push_back( ...

  4. Netty简单认识

    简介 Netty 是由JBOSS提供的一个 Java开源框架, 现在是 Github上的开源项目 Netty 是一个异步的.基于事件驱动的网络应用框架式, 用以快速开发高性能.高可靠性的网路IO程序 ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-cloud

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. Java 文件

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  7. JuJu团队11月27号工作汇报

    JuJu团队11月27号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 于达 将真实数据处理后按矩阵读入, 以供训练使用  提供generator的接口 对julia语言还不够 ...

  8. ArcoLinux美化教程

    ArcoLinux美化教程 1. 前言 ArcoLinux已经足够美观,这里主要是讲解如何配置桌面特效 2. 安装compiz $ yay -S compiz 3. 用compiz替换xfwm4 编辑 ...

  9. Node.js 加载静态资源css,js等不显示问题的解决方法

    一,原因 1,没有响应到css等文件 2,响应类型是由文件的后缀名决定 (1)html的请求头 Content-Type : text/html ; charset=utf-8 (2) CSS的请求头 ...

  10. mcu运行时间估算

    昨个伙计问我他那个板子的程序运行时间估算问题… 现在说一下估算的思路.首先确定有几个点,板子的主频.时钟周期,机器周期. 首先由主频f得到一个时钟周期为1/f. 再者时钟周期与机器周期有一个比例关系, ...