form表单提交数据编码方式和tomcat接受数据解码方式的思考

Python程序—定子故障三相永磁同步电动机振动与电流数据集 1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34% 阅读详情
  做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了!这篇文章是我长时间和乱码做斗争的一些理解的积累,还希望有更多的朋友给出指点和补充。 
  form有2中方法把数据提交给服务器,get和post,分别说下吧。 
(一)get提交 
  1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。 
   
    对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc 
(很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http://localhost:8080/servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在 这里。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。 
   2。服务器端(tomcat)是如何将数据获取到进行解码的。 
   第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于get方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接 
Java代码   收藏代码
  1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")  

还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置 
Xml代码   收藏代码
  1. <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>  

这样是让tomcat在获取数据后用指定的方式URL decoder,URL decoder的介绍在 这里 


(一)post提交 
1.客户端(浏览器)的form表单用post方法是如何将数据编码后提交给服务器端的。 
  在post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢? 
   在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码,其实它还有个作用就是指定form表单的post方法提交数据的URL encode编码方式。从这里可以看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。 
2。服务器端(tomcat)是如何将数据获取到进行解码的。 
如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是request.setCharacterEncoding("字符集")可以派上用场。 

我发现上面说的tomcat所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照这种方式编码。 
   有2篇文章推荐下,地址分别是 
http://www.cnblogs.com/yencain/articles/1321386.html; 
http://wanghuan8086.iteye.com/blog/173869
分享到:   
参考知识库
Android知识库 37704  关注 | 3152  收录
React知识库 3588  关注 | 393  收录
人工智能基础知识库 16607  关注 | 212  收录
Java 知识库 34998  关注 | 3748  收录
评论
13 楼  zchaony 2009-10-14  
filter
12 楼  czwlucky 2009-10-13  
不知道大家有没有遇到这样的参数?
http://aa.com?name&age=abc99
这里是希望name&age是key,abc99是值,像这样的参数如何处理才正确呢?
我现在遇到的问题出在webwork的使用上,它使用ognl自动组装参数到对象,但遇到这样的参数时会抛异常。
11 楼  jieyuan_cg 2009-07-05  
解决get方法提交参数乱码问题的关键:在页面response回去之前,如果页面中的url里面带有中文字符,就一定把这个中文字符进行编码。经过编码后的字符串都类似于%xy,不管浏览器用什么方法encode,都不会出错。
10 楼  xukejun_BabyY 2009-06-16  
谢谢分享,有了进一步的理解!!
9 楼  jiongerher 2009-03-02  

rubyeye 写道
在程序里我们可以直接 
Java代码   收藏代码
  1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")  




请问楼主,我这样理解是否对: 



tomcat的解码过程是  解码+解释 
tomcat默认是在解码后用ISO8859-1进行解释。 无论给tomcat指定何种URIEncoding方式,实际上都能真确解码,只不过解码后的解释可能会应为设置的URIEncoding,而解释不正确。 

所以request.getParameter("name")已经拿到了解码的结果,只是解释的不对。这样理解对吗?
8 楼  asuperfly 2008-12-18  
我的读书笔记:URLDecoder 
用post很重要的在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/> 
强烈建议使用post提交
7 楼  rubyeye 2008-12-12  
hyogacs 写道

提交的方式就是这样的:http://localhost:8080/Action?name=大连,这样里面的参数值“大连”默认是用GBK编码方式传到Action这个servlet的,我想知道怎么能在servlet里面得到“大连”这个值。get方法也许是我理解的不对,说的不好,总之意思就是跟在请求后面用?传递参数。

从你的情况看,你的tomcat配置了URIEncoding="UTF-8",并且你可以肯定数据是通过GBK字符集URLEncoder的,那么用你试过的new String(request.getParameter("name").getBytes("UTF-8"),"GBK"))方式就能取到正确的数据。
所以我也不好说了,你再检查下你的数据是通过GBK字符集URLEncoder的吗?
6 楼  hyogacs 2008-12-11  
提交的方式就是这样的:http://localhost:8080/Action?name=大连,这样里面的参数值“大连”默认是用GBK编码方式传到Action这个servlet的,我想知道怎么能在servlet里面得到“大连”这个值。get方法也许是我理解的不对,说的不好,总之意思就是跟在请求后面用?传递参数。
5 楼  rubyeye 2008-12-07  
hyogacs 写道

有个用GET传递参数的问题。想问一下LZ,就是我在tomcat配置了 URIEncoding="UTF-8",我在我的页面将我的中文信息用java.net.URLEncoder.encode("大连","UTF-8")编码后,在servlet里面request.getParameter("name")可以得到正确的中文信息大连。如果默认提交的话,我发现我的浏览器是用GBK编码后发给服务器的,即与java.net.URLEncoder.encode("大连","GBK")效果相同。现在的问题是我的tomcat配置文件不变的情况下,我能否在jsp页面不处理,即用默认的gbk编码方式传到servlet,而在servlet中取到正确的值呢?如果能,请问怎么取?(我试过new String(request.getParameter("name").getBytes("UTF-8"),"GBK")),取不到)。先提前谢谢lz

用你的方法取不到值是有点奇怪了,你的get方法是怎么带参数的呢?
在 http://www.cnblogs.com/yencain/articles/1321386.html文章里面提到:
http://localhost:8080/大连?name=大连
上面的URL里面,前一个大连和后一个大连的URLEncoder是不一样,你是怎么带参数的呢?
4 楼  hyogacs 2008-11-28  
有个用GET传递参数的问题。想问一下LZ,就是我在tomcat配置了 URIEncoding="UTF-8",我在我的页面将我的中文信息用java.net.URLEncoder.encode("大连","UTF-8")编码后,在servlet里面request.getParameter("name")可以得到正确的中文信息大连。如果默认提交的话,我发现我的浏览器是用GBK编码后发给服务器的,即与java.net.URLEncoder.encode("大连","GBK")效果相同。现在的问题是我的tomcat配置文件不变的情况下,我能否在jsp页面不处理,即用默认的gbk编码方式传到servlet,而在servlet中取到正确的值呢?如果能,请问怎么取?(我试过new String(request.getParameter("name").getBytes("UTF-8"),"GBK")),取不到)。先提前谢谢lz
3 楼  ddd0401 2008-11-22  
对这问题一直一知半懂的,多谢分享,thinks
2 楼  usherlight 2008-11-21  
good.
1 楼  chhg58 2008-11-21  
对get post 又有了进一步的了解
C8T6和ZET6选型更换过程中出现.\Obj\Project.sct(7): error: L6235E: More than one section matches selector - cann 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、问题原因二、解决方法三、现象总结 前言 又一件离谱的事情发生了,我之前转换过程中没有发生的错误,今天拿出来程序重新编译了一下,结果他奶奶滴一个新的错误出现了,而且我还完全不知道是什么原因导致的,先上图: 一、问题原因 之前我已经尝试过更换芯片选型,但是没有出现此类问题,今天更改的时候发现了,我还以为是个偶然错误,结果换来换去,还是有这个问题,那我之前说c8t6的程序更改成zet6上跑只需改芯片选型和宏定义岂不是啪啪打. 阅读详情

相关推荐

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

新年第二篇文章,收尾一个去年计划中发表文章和实现功能。

kbq的博客 1万+

关于java请求转发的整理

网络通信这部分一直是我最头疼的部分,总是分的不是很清楚,这次要彻底整理一下

qq_30819871的博客 1243

Orange Pi 3B+刷入EmuELEC全过程:手把手教程

手把手教你如何在Orange Pi 3B+上成功刷入emuelec系统,涵盖烧录工具、镜像下载到启动设置的完整流程,让复古游戏体验轻松实现。

weixin_35732273的博客 1094

在IE下面指定表单编码方式

在跨业务、跨网站发送数据或者业务升级的时候,我们有的时候需要指定发送数据的编码方式,比如页面是utf-8编码的,而发送出去的数据却希望是GB2312编码的。在做Ajax开发的时候,我们往往都是用vbscript或者用查字典法来解决这个问题(http://www.blogjava.net/emu/articles/31756.html)。但是有些业务,也许并不需要做成Ajax这么复杂,用表单提交显得

Emu的专栏 —— 关注前端技术,关注网络优化 5376

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

AI人工智能与模拟退火:碰撞出的智慧火花

本文旨在为读者全面介绍模拟退火算法在人工智能领域的应用。我们将涵盖从基础理论到实际实现的完整知识体系,帮助读者理解这一受自然界启发的优化技术如何解决复杂的计算问题。文章首先介绍模拟退火的基本概念,然后深入其工作原理和数学基础,接着通过Python实现展示具体应用,最后讨论实际应用场景和未来发展方向。模拟退火(Simulated Annealing, SA):一种受物理退火过程启发的概率性优化算法能量函数(Energy Function):评估系统状态的函数,对应优化问题的目标函数。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 453

Form 表单数据编码、解码--encodeURIComponent、URLSearchParams、FormData

本文主要讲解,通过 web api 来处理各种参数问题,防止产生安全问题,以及更便利的操作。 先看一个示例: const response = await fetch(url, { method: 'POST', body: `text=${text}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) const json = await response.json() 上述代码会出现一些“安

李刚的学习专栏 3413

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

form表单、控制器中接收表单提交数据的4种方式

Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈现的一个效果,就直接讲form表单提交的方式了 图表 1 【复习】 在开始讲form表单提交的方式之前会复习一下form表单元素 Form表单元素 Text: 文本框 <select> <option&gt...

weixin_49756484的博客 6258

智能客服系统知识库构建:长尾问题解决方案全解析

智能客服系统知识库构建:长尾问题解决方案全解析

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 4112

大数据分析案例-基于决策树算法构建信用卡违约预测模型

本项目旨在使用机器学习等算法构建信用卡违约预测模型,主要应用在金融相关领域,根据用户以往的行为数据来预测是否会违约,有利于商业银行防范和化解信用卡风险,完善信用卡违约风险管理工作。本次实验通过探索性分析以及使用决策树构建信用卡违约模型,得出以下结论:1.可透支金额主要集中在0~200000之间。2.性别对于可透支金额的影响较小。3.受教育程度和婚姻状况对可透支金额的影响较大。4.决策树模型的准确率为0.88,模型效果还有待提高。

m0_64336780的博客 7575

Form表单提交数据编码方式和tomcat接受数据解码方式的思考

form有2中方法把数据提交给服务器,get和post,分别说下吧。 (一)get提交 1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。   对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc (很常见的一个乱码问题就要出现了,如果url中出现中文或其它...

一叶孤舟 161

Python爬虫教程:抓取Android或iOS应用中的数据

随着智能手机的普及,移动应用程序已经成为我们生活中不可或缺的一部分。从社交媒体、在线购物到金融服务和健康管理,几乎所有领域都有相应的手机应用程序(App)服务用户。而这些应用程序通常会存储大量的数据,例如用户行为、产品信息、订单记录等。如果我们能有效地抓取这些数据,可以为数据分析、商业智能、用户行为分析等提供有力支持。本文将重点介绍如何使用Python爬虫技术抓取Android或iOS应用中的数据,尤其是如何从这些应用的后端接口、存储、或网页中提取数据。我们将探讨如何通过反向工程技术访问移动应用中的API接

2201_76125261的博客 802

[转]form表单提交数据编码方式和tomcat接受数据解码方式的思考

[转]form表单提交数据编码方式和tomcat接受数据解码方式的思考2008-12-21 19:54      做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样

oyto12o的专栏 1287

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

对 javaEye上帖子 form表单提交数据编码方式和tomcat接受数据解码方式的思考 的一点理解

引自http://www.javaeye.com/topic/266705做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了!这篇文章是我长时间和乱码做斗争的一些理解的

小樓東風的专栏 2454

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 解决Struts2中表单提交到action时的中文乱码
下一篇: 表单用post方法提交数据时乱码问题(转)
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值