POST和GET方法乱码解决方案
前言
在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方法乱码解决方案的更多相关文章
- IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)
IntelliJ IDEA 乱码解决方案 (项目代码.控制台等) 最近IDE从eclipse改成IntelliJ IDEA 了,原因是公司大部分人都在用这个IDE,而且一直推荐用,所以尝尝鲜.换的第一 ...
- JSP中pageEncoding和charset区别,中文乱码解决方案(转载)
转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...
- css中文字体乱码解决方案
css中文字体乱码解决方案:把css编码和html页面编码统一起来.如果html页面是utf-8.css.js也统一成utf-8编码.还有一个避免中文乱码的办法就是把中文字体写成英文来表示 css中文 ...
- Intellij Idea乱码解决方案
使用Intellij Idea经常遇到的三种乱码问题: 1.工程代码乱码 2.main方法运行,控制台乱码 3.tomcat运行,控制台乱码 解决方案: 1.工程代码乱码 Settings > ...
- 【转】git乱码解决方案汇总
git乱码解决方案汇 2012-11-04更新:官方的“终极”解决方案:msysGit1.7.10开始使用UTF-8编码保存文件名. 2011-10-24更新: 从一篇链接到本篇文章的文章(我对这篇文 ...
- JMeter:全面的乱码解决方案【转】
本文是转自https://www.cnblogs.com/mawenqiangios/p/7918583.html 感谢分享者 中文乱码一直都是比较让人棘手的问题,我们在使用Jmeter的过程中, ...
- C#.net地址传参汉字乱码解决方案
C#.net地址传参汉字乱码解决方案 web.config文件: <system.web> <globalization requestEncoding="GB2312 ...
- (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全
JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...
- Hive中文注释乱码解决方案(2)
本文来自网易云社区 作者:王潘安 执行阶段 launchTask 回到Driver类的runInternal方法,看以下执行过程.在runInternal方法中,执行过程调用了execute方法 ...
随机推荐
- dubbo 相关面试题 有用(转)
调用关系说明: · 0. 服务容器负责启动,加载,运行服务提供者. · 1. 服务提供者在启动时,向注册中心注册自己提供的服务. · 2. 服务消费者在启动时,向注册中心订阅自己所需的服务. · 3. ...
- 【Jasypt】给你的配置加把锁
前言 前几天,有个前同事向我吐槽,他们公司有个大神把公司的项目代码全部上传到了 github,并且是公开项目,所有人都可以浏览.更加恐怖的是项目里面包含配置文件,数据库信息.redis 配置.各种公钥 ...
- flutter安装中的一些方法
1.配置flutter环境变量 进入终端 vim ~/.bash_profile export ANDROID_HOME=~Library/Android/sdk export PATH=$PATH: ...
- http https 干货
HTTPS原理 在谈HTTPS原理之前,首先了解一下Http和Https的区别. Http(全称:Hyper Text Transfer Protocol),一般称为超文本传输协议,也是互联 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-asterisk
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- JuJu团队11月28号工作汇报
JuJu团队11月28号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 于达 解决了数据接口的bug 生成generator形式, 并用熟悉Julia处理数据的方法 处理数据步 ...
- php5.3不支持 ereg、ereg_replace等函数问题
在php5.3环境下运行oscommerce,常常会出现Deprecated: Function ereg() is deprecated in...和Deprecated: Function ere ...
- C++面试常见问题——05字符串的逆序
字符串的逆序 #include<iostream> #include<string.h> using namespace std; void ReverseStr(char s ...
- 聊一聊Java中的各种运算符(转载)
计算机之所以叫"计算机",其最基本用途之一就是运算,对应刚刚接触Java的小伙伴而言,熟悉并掌握Java中的各种运算符及其在表达式中的运算优先级是十分必要的. 算术运算 算术运算主 ...
- 利用 Python 破解 ZIP 或 RAR 文件密码
我们经常会从网络上下载一些带密码的压缩包,想要获取里面的内容,往往就要给提供商支付一些费用.想要白嫖其中的内容,常见的做法是百度搜索一些压缩包密码破解软件,但后果相信体验过的人都知道.本文将会利用 P ...