文档章节

GET POST 提交时编码流程

learn_more
 learn_more
发布于 2015/04/03 18:45
字数 1495
阅读 167
收藏 0

    今天在 Linux(语言en,编码utf-8)环境下进行测试,发现GET请求数据,后台通过 String value = request.getParameter("name") 获取的值为乱码,可是如果使用post方式提交,则不会发生乱码情况!

对于GET方式,可以采用 : new String(value.getBytes("iso8859-1"),"utf-8");

    那么问题来了,GET方式与POST到底有什么区别呢?

1、Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是统一资源定位,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。其实这就是Restful的简单解释。


2、GET 在 HTTP 中这样定义的:

    1)安全的:只是查询信息,不会对信息进行修改

    2)幂等的:相同的参数查询,任何时候都是得到同样的结果

3、POST在HTTP 中这样定义的:

    1)不安全的:修改数据


4、GET方式请求数据时,参数的长度是有限制的(说url长度是受限制的更合理),其实这个限制不是HTTP规范规定,而是浏览器和服务器自身规定!一般都是1-2kb。

5、POST方式请求数据,参数长度是不受限制的,如果受限,那么文件上传就无法解决了,但是如果你在url后面附带参数,那么拼接的url长度是受限的,因为这部分参数实质是POST请求。

6、GET方式请求时,参数会负载在浏览器的地址栏上,那么是很不安全的,因为这些数据实质是可读的(网络编码),而且浏览器会缓存这些历史记录,因此,GET方式是不安全的。

关于GET编码流程

1)在jQuery.ajax 中有一个type可以设置为提交方式,我们设置为GET,然后我们还可以设置contentType,即提交给服务器的编码方式,我们可以设置为:contentType:'application/x-www-form-urlencoded; charset=utf-8',这个的作用就是,把数据传输到服务器时,服务器的编码方式为utf-8,但是我在测试当中发现,这个设置是不起作用的。实际编码还是系统的默认编码。那么,GET请求流程是这样的:

首先:jQuery.ajax , 提交请求,浏览器会把参数转为网络编码(%byte1%byte2%byte3),也就是用%分割的UTF-8编码,这个可以采用js方法urlEncode替代。参数编码好之后,用?和&符号拼接在url后面,同时包装好请求头,也就是刚才的contentType内容等,一并发送给服务器(Tomcat),Tomcat会对网络编码进行解码(这里是GET请求乱码的根源),关键是解码成哪种格式?默认情况下,他是根据服务器设置的默认编码格式,可能是UTF-8 可能是ISO-8859-1,具体不是很清楚,当然,我们可以修改默认值,在server.xml中修改,如下:

<connector port="8080"

    redirectPort="8443"

    connectionTimeout="20000"

    URIEncoding="UTF-8"/> 

这个时候,就会转为utf-8编码,那么他其实编码与contentType没有关系,不过contentType的值可以从这里获取:

String charset = request.getCharacterEncoding();

服务器把网络编码转换完之后,那么Servlet就可以通过 request.getParameter()获取了,获取的字符就是之前服务器转码之后的,很多人在这一步乱码,原因就是:服务器解码时不知道应该为哪种编码导致,所以问题解决方式,自然大家也知道了,采用上面的配置就可以了。当然,看了整个流程,可能你还想到这样避免乱码,就是手动字符串转码,如下:

String value = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

这种方式其实是错误的,因为Java是跨平台的,那么一个web可以在多平台运行,换了一个服务器可能它采用的编码方式就不一样,那么这种方式就不行了,何况采用这种方式也要知道服务器是采用什么编码方式。

另外,要纠正一下Servlet API的使用,很多人通过如下方式来解决GET乱码问题:

request.setCharacterEncoding("UTF-8");

这个设置对于GET请求是毫无用处的,它用于POST请求。

关于POST编码流程

1)在jQuery.ajax 中同样可以设置提交方式为POST,但是contentType已经没有用了,提交类型采用默认的contentType:'application/x-www-form-urlencoded; charset=utf-8',编码格式是固定UTF-8的,不过同样服务器对网络编码进行解码和转为默认编码格式给Servlet,这个时候,就可以通过设置request.setCharacterEncoding("UTF-8");来控制服务器编码,这样就不会乱码了。通过POST请求流程可以得到一个启发,就是为了避免GET请求乱码,可以把GET改为POST请求方式。另外,说明一点,如果是上传的话,那么参数是流的新式传输,那个时候ContentType需要这么设置:multipart/form-data

总结起来,GET与POST的差异就是如下几点了:

1)GET请求会把参数附带在URL上,而POST是放在包体中发送

2)GET方式的URL是在浏览器的地址栏中可见的,POST是不可见的

3)GET方式的URL可以被浏览器作为历史记录缓存,作为书签收藏,POST方式不行

4)GET方式会缓存数据,POST不会

5)GET方式不能上传,POST可以

6)GET方式的URL参数长度是受限的,POST不受限制


© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
nodejs接收post请求参数

nodejs接收post请求参数 1.1-浏览器发送post请求参数的方式 1.2-服务端接收post请求参数的方式 post请求参数不直接在url路径中拼接,而是放在请求体中发送给服务器 1.1-浏览器发送post请求参...

u013263917
2017/11/30
0
0
js模拟form提交的一些问题

当在页面中需要进行post提交时,一般的做法是将控件放入form标签中,加入一个submit按钮进行post方式的提交。 遇到的问题 页面中有两个Tab进行切换,一个tab中需要获取用户输入的值进行post提...

达摩院法师
2010/09/07
0
0
axios 提交数据到 flask 的 数据格式问题

HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。常见的四种编码方式如下: 1、application/x-www-form-urlencoded 这应该是最...

阿豪boy
2018/02/18
283
0
一次post提交中文造成乱码问题的分析

前提条件 在解决问题之前,web模块中配置了自定义的HttpEncodingFilter和GetHttpServletRequestWrapper,期待能够解决所有服务器上的中文乱码问题,很遗憾,让大家失望了。最后给出web.xml中...

彭苏云
2015/09/18
3.9K
3
url 发送请求乱码解决。

来源:http://blog.csdn.net/shiqidide/article/details/6987449 最近遇到的这个问题,在百度找到的 发出来!作者地址是上面的网站 最近又碰到了中文乱码问题,这里我没有把数据库牵扯进来,...

机会到了可是你准备好了吗
2015/11/05
2.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

mac下redis安装、设置、启动停止

常用命令说明 redis服务器:redis-server redis客户端:redis-cli redis性能测试工具:redis-benchmark AOF文件修复工具:redis-check-aof RDB文件修复工具:redis-check-rd redis设置临时密...

botkenni
9分钟前
3
0
好程序员web前端分享HTML5常见面试题集锦四

好程序员web前端分享HTML5常见面试题集锦四 1、为什么要初始化CSS样式? 答案:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面...

好程序员官方
11分钟前
2
0
CDN的网络架构是什么?

CDN网络架构主要由两大部分,分为中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房,边缘主要指异地节点,CDN分发的载体,主要由Cac...

云漫网络Ruan
11分钟前
2
0
pandas入门07---可视化

01 入门 制作提供信息的可视化是数据分析的重要任务之一。首先介绍一下matplotlib库。 import matplotlib.pyplot as pltimport numpy as npdata = np.arange(10)print(data)plt.plot(da...

筠初
12分钟前
2
0
201_PyTorch中文教程:Torch与Numpy互操作

201_PyTorch中文教程:Torch与Numpy互操作 Numpy是经典的数学计算库,Torch中的Tensor可以与之互相转换,从而可以充分利用二者的计算函数和模型,以及使用其它支持Numpy的软件库和工具。但需...

openthings
12分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部