关于servlet中doGet和doPost乱码再一次理解
今天系统的整理了在web项目下,出现的编码问题,下面就做一些总结:
首先对HTTP协议中对GET和POST的定义:
| GET | POST | |
|---|---|---|
| 后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
| 书签 | 可收藏为书签 | 不可收藏为书签 |
| 缓存 | 能被缓存 | 不能缓存 |
| 编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
| 历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
| 对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
| 对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
| 安全性 |
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。 在发送密码或其他敏感信息时绝不要使用 GET ! |
POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
| 可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
再次理解servlet中有的那几个方法:
增、删、查、改
get -> select
post -> update
put -> insert
delete -> delete
但是其实get和post就能完成我们的所有操作!
其实有doGet、doPost、doPut和doDelete但是其中doPut和doDelete用的较少。而get方式直接加在url后面,post方式必须通过表单。
我们常用的就是doGet和doPost,get方式其实在http协议中并不是一个传数据的角色,更多的是用来从服务器上获得数据的,严格意义上来讲最初不是用来从客户端到服务器这个传输数据的;只是form表单的get方式提交,对url传值的扩展通过?name=xxx&password=xxx诸如此类的方式。
这里我们对get的url传值已经有了深刻的了解,也就更能理解为什么我们传大文本和文件图片等等的时候,都是使用post的方式了吧?url传值不能传递实体内容,因为url的长度在http协议中虽然没有明确的长度规定,但是在浏览器的规范中都是限制了长度的,1KB或2KB或多或少!
补充存在于:url中的内容都要通过urlencode进行加密,成符合url格式的字符串:
| ‘ ‘ | 空格 | %20 |
| ‘!’ | 感叹号 | %21 |
| ‘&’ | 花at | %26 |
| ‘/’ | 斜杠 | %2F |
| ‘:’ | 冒号) | %3A |
| ‘=’ | 等于号 | %3D |
| ‘?’ | 问号 | %3F |
get方式遇到的问题:
问题的起因很简单,在网上看了一些博文说,在tomcat作为的web容器下,通过GET方式进行表单提交,传参到servlet中会出现乱码,但是我在本地进行测试的时候发现,并没有出现GET方式乱码的情况:
因为我的IDE中配置的工作空间的编码格式是UTF8的,所以猜测我的tomcat可能是UTF8的。
首先回忆我是不是对我的tomcat进行了配置,故到tomcat中的config中查看server.xml中查看是不是有配置:
发现其中并没有多余的配置,测试了8.0和发现也没有出现乱码的情况,后面了解到tomcat从8.0开始默认的编码就是UTF8了,测试7.0的Tomcat发现,GET方式出现了乱码,通过:new String(xxx.getBytes(“ISO-8859-1“), “utf-8“);解码正常:

测试结果Tomcat从8.0开始转化为默认编码为utf-8的格式了,但是8.0以下的tomcat默认的编码还是ISO-8859-1;
Tomcat8.0及以上默认编码为utf-8;
Tomcat7.0及以下默认编码为ISO-8859-1;
项目开发下,我们可以通过在tomcat的server.xml中的URIEncoding="UTF-8";

这样设置tomcat的编码格式为utf-8来配合我们IDE中的utf-8,来保证在开发过程中不出现乱码问题;
在实际的上线的时候
1.如果可以修改web容器的编码为utf-8最好(urlEncoding="utf-8");
2.不行的话我们可以选择:过滤器+动态代理的方式,用动态代理的方式来重写HttpServlet中的getParameter方法【逻辑:如果为GET方式的request请求,就做一个newString(xxx.getBytes(“ISO-8859-1”), “utf-8”)】来解决ISO-8859-1编码下的tomcat的get方式中文乱码的问题;【在过滤器中的操作】 -- 后面会专门讲
3.当然最好的就是,不要使用get方式进行中文的传参!
POST方式遇到的问题:

使用POST进行获取参数的时候也要注意!
必须在doPost方法的一开始就使用:request.setCharacterEncoding("utf-8");
或者在过滤器中一开始就写上request.setCharacterEncoding("utf-8");来保证POST方式后面获取到的parameter正常,
【这里有个问题要记录一下,如果不写这一句直接在doPost中getParameter,就会造成获取的中文参数异常:这句代码约束post中的内容编码为utf-8,必须写在doPost或者filter中第一个request.getParameter之前才行,如果没有设置utf-8,在调用第一个getParameter之后request中的所有键值对就都被解析成了ISO-8859-1的编码的字符了,再去设置characterEncoding为utf-8就已经无效了,就只能通过getParameter之后new String(xxx.getBytes("ISO-8859-1"),"utf-8")的方式来还原字符串了】
但是get方式是取决于Tomcat的默认的urlencoding的编码。
关于URL中的中文的问题:
在IE下的url中不能显示中文,但是在firefox和chrome中的url中可以显示中文,因为我都设置为了unicode,所以在unicode编码的浏览器环境下,原本encoder.encode(“utf-8”);的数据,都被浏览器替换解密了出来。
在开发中,为了保证开发的稳定性,我们在能够设置utf-8的地方都设置utf-8;
在运行环境复杂,为了保证系统的稳定下,尽量使用doPost传值,不使用get方式传值,或者url传值中不使用中文!
关于servlet中doGet和doPost乱码再一次理解的更多相关文章
- servlet中doGet()和doPost()的用法
转自:https://blog.csdn.net/qq_38963960/article/details/79468182 1.servlet中doGet()和doPost()的用法 一般来说我们是用 ...
- servlet中doGet()和doPost()的区别
1.生成方式 get方法有四种: ①直接在URL地址栏中输入URL ②网页中的超链接 ③form中method为get ④form中method为空时,默认是get提交 post只知道有一种:form ...
- Servlet中response、request乱码问题解决
Java Web(二) Servlet中response.request乱码问题解决 三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现 ...
- Java Web之Servlet中response、request乱码问题解决
Java Web之Servlet中response.request乱码问题解决 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...
- Servlet的doGet与doPost方法的区别与使用
Servlet的doGet与doPost方法的区别与使用 2016年07月07日 13:05:13 阅读数:10222 一,区别 在使用表单提交数据到服务器的时候有两张方式可共选择,一个是post一个 ...
- 去除myeclipse中doget和dopost方法中的注释
当我们使用myeclipse新建servlet时发现doget和dopost方法中有一些无用的注释,每次新建一个servlet时都要手动删除特别麻烦. 下面就教大家如何去除这些注释! 以myeclip ...
- 【Servlet】doGet()与doPost()的区别
doGet与doPost的区别 .Servlet接口只定义了一个服务方法--service .当发出客户端请求时,调用service方法并传递一个请求和响应对象 .使用时经常在doPost()中调用d ...
- 自定义servlet重写doGet或doPost方法是如何实现多态的
我们知道,如果我们自定义一个servlet继承HttpServlet,并且重写HttpServlet中的doGet或doPost方法,那么从浏览器发送过来的request请求将调用HttpServle ...
- 自定义servlet重写doGet或者doPost方法时,405 method not allowed
自定义servlet public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServlet ...
随机推荐
- File类与常用IO流第四章——IO字节流
一切文件在存储时,都是以二进制数字的形式保存的,都是一个一个字节.无论使用什么样的流对象,底层传输的始终是二进制数据. 字节输出流 OutputStream java.io.OutputStream ...
- 【转载】SpringMVC学习笔记
转载于:SpringMVC笔记 SpringMVC 1.SpringMVC概述 MVC: Model(模型): 数据模型,提供要展示的数据,:Value Object(数据Dao) 和 服务层(行为S ...
- Hive——基本DML语句
Hive--基本DML语句 DML:Data Manipulation Language(数据操作语言,与关系型数据库相似) 官方手册:https://cwiki.apache.org/conflue ...
- 【字符串+排序】宇宙总统 luogu-1781
题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 分析 给字符串排个序. AC代码 #include & ...
- Deepin 20.2.2 /UOS 20.2 添加ppa源
由于 工作需要,需要通过PPA安装一些优质的软件包,但是 Deepin 默认不支持PPA源 解决方法 由于Deepin/Uos系统默认是没有安装PPA的那么我们得先安装PPA来支持"add- ...
- C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载
基于Windows驱动开发技术详解这本书 一.简单的INF文件剖析 INF文件是一个文本文件,由若干个节(Section)组成.每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容.每一行就是一 ...
- 利用PhotoShop CS6进行抠图
相信大家在前端开发中一定遇到过抠图,一个方形图有好多种方法可以扣出来你想要的图片,可是你知道怎么扣出一个圆形的图片吗?(另附ps破解办法 亲测可用) 一:我们需要安装ps软件并进行破解,这里进行下载破 ...
- ZooKeeper(2181、2171) 未授权访问
下载地址http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/ tar -xzvf zookeeper-3.4.14.tar.gz cd ...
- 自学linux——15.云主机的购买流程及域名的购买备案解析
项目上线流程 一.服务器选配购买 项目上线的服务器必须是外网服务器 1.服务器购买情况 真实服务器(成本过高,购买内部自用) 云服务器(上线首选):阿里云,腾讯云,华为云 2.购买阿里云服务器:htt ...
- Sth about Educational DP Contest
Contest Website : atcoder.jp/contests/dp \[\begin{array}{c|C|c|c} TaskNum & TaskName & Statu ...