- 浏览: 502699 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (437)
- Windows设置 (2)
- oracle数据库 (39)
- bug--jsp (4)
- j2se (13)
- js (40)
- bug-tomcat不能启动程序 (1)
- Hibernate (29)
- eclipse (20)
- java (65)
- 设计模式 (6)
- bug (18)
- PL/SQL (11)
- 前台 (5)
- 杂谈 (25)
- UML (1)
- jdbc编程 (2)
- 技术调研 (1)
- 数据通信 (2)
- ios (1)
- servlet自学笔记 (10)
- tomcat (9)
- SQL学习笔记 (6)
- java工具 (1)
- 数据库设计 (4)
- javascript (10)
- jsp (11)
- struts (17)
- ajax (7)
- linix/Unix (6)
- 资源 (3)
- spring (14)
- 算法 (5)
- 计算机网络 (2)
- http (5)
- c++ (2)
- web应用 (3)
- jvm (5)
- java中的字符编码 (14)
- java代码库 (2)
- classloader (1)
- 读书笔记 (1)
- c (1)
- 开源软件 (1)
- svn (1)
- AOP (1)
- java序列化 (1)
- 多线程 (4)
- The legendary programmers (1)
- Apache http Server (1)
- html tag (3)
- struts1.X学习笔记 (5)
- buffalo (1)
- 自己收藏 (0)
- TOEFL(IBT) (1)
- 网络翻墙 (0)
- 编译原理 (1)
- 书籍推荐 (1)
- css (10)
- javaee环境搭建资料 (1)
- 开源工具 (1)
- 美国生活 (1)
- spring自学 (3)
- log4j (3)
- 算法与数据结构 (5)
- 病毒,插件处理大全 (1)
- flex (2)
- webservice (1)
- git (7)
- cs (1)
- html (4)
- javaee (6)
- 开车 (0)
- springmvc (3)
- 互联网架构 (2)
- intellij idea (18)
- maven (15)
- mongodb (2)
- nginx (1)
- react (3)
- java基础例子 (2)
- springboot (2)
- 培训 (5)
- mysql (3)
- 数据库 (3)
- 生活 (2)
- intellij (3)
- linux (2)
- os (3)
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
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到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,post方法先看有没<meta http-equiv="charset"
content="iso-8859-1">,没有,则用内码。中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去(http请求头在网络上是以iso-8859-1编码传送的 固定的,get/post方法的请求报头均是如此)。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....(类似于内码转换,利用中间表,内存的程序转换成iso-8859-1编码)的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。
--------------------------------------------
上面说"URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了" ,那么浏览器的编码方式是什么呢?首先是依赖
优先级是:<%@ page contentType="text/html;charset=UTF-8" %> 大于 <%@ pageEncoding="UTF-8"%> 大于 页面编码方式(
通过 右键->属性 查看) ,如果<%@ page contentType="text/html;charset=UTF-8" %> 在一起指定 <%@ pageEncoding="UTF-8"%>
如:<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> 那么charset 和pageEncoding编码要一致,否则
对有中文的页面会报错。
另外对于是form 的get 请求会encoding的,如图一,而不是form 的get 请求,而是自行构造的带有中文的URL 类似于:
window.location.href = "/cnca/conversionEx/download.action?startOscym="+startOscym+
"&endOscym="+endOscym+"&modelid="+modelid+"&realname="+realname;
是不会encoding的,如图二。
对Ajax 提交的post 或get 请求,也不会encoding。如果是Tomcat,在Action 中, request.getParameter()确定的值不乱码,
而部署到ws 上确乱码了, 所以应该人为去encoding,在js 用:
var url = "/cnca/conversionEx/download.action?startOscym="+startOscym+
"&endOscym="+endOscym+"&modelid="+modelid+"&realname="+realname;
url = encodeURI(url);
--------------------------------------------
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显然不行,在程序里我们可以直接
- new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")
还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置
Xml代码
- <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>
这样是让tomcat在获取数据后用指定的方式URL decoder(遇到“%”就做decode动作),URL decoder的介绍在这里
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/URLDecoder.html#decode(java.lang.String,%20java.lang.String)
--------------------------------------------
我认为:URL 在经过 encoding (在网络上以字节码方式传输), 如以encoding的编码是GBK 为例,java.net.URLEncoder.encode("组织名称","GBK"),
在经过 encoding 提交到服务器(这里以Tomcat为例),用request.getParameter() 时首先经过了如下解码过程
java.net.URLDecoder.decode(经过encoding后以%xy表现形式的字节码,"ISO-8859-1"),因为encoding 的编码是GBK,
而decoding(解码)时的编码是ISO-8859-1。所以request.getParameter()得到是乱码。
用这种new java.lang.String((request.getParameter()).getBytes("ISO-8859-1"),"GBK") 以逆向方式:先用ISO-8859-1 Encoding,
然在用GBK decoding 成字符串。如下:
System.out.println(new java.lang.String((java.net.URLDecoder.decode(java.net.URLEncoder.encode("组织名称","GBK"),"ISO-8859-1")).getBytes("ISO-8859-1"),"GBK"));
(二)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方法提交数据在http request body的URL encode编码方式。从这里可以看出对于get方法来说,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。
2。服务器端(tomcat)是如何将数据获取到进行解码的。
如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是request.setCharacterEncoding("字符集")可以派上用场。
http://www.cnblogs.com/yencain/articles/1321386.html;
http://wanghuan8086.javaeye.com/blog/173869
自从Tomcat5.x开始,GET和POST方法提交的信息,tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码。而GET请求则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码,而这位朋友使用的正好是GET请求,因此,tomcat将会使用iso-8859-1将提交的字节转换成字符串。
解决的方法有三个:
1. 将GET请求改成POST请求,然后就可以使用request.setCharacterEncoding方法设置编码,并使用request.getParameter方法直接获得中文请求参数了。
2. 不用改GET请求,在Servlet中使用如下的代码来得到中文请求参数。
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
3.为了保证get数据采用UTF8编码,在server.xml中进行了如下设置
<connector port="8080" maxthreads="150" minsparethreads="25" <br="">maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="99" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>
发表评论
-
【转】字符编码笔记:ASCII,Unicode 和 UTF-8
2017-12-12 19:09 449今天中午,我突然想搞清楚 Unicode 和 UTF-8 之 ... -
【转】HTTP协议及浏览器编码行为
2012-12-19 13:48 1392转自:http://blog.csdn.net/hap ... -
【转】JSP中request.getParameter()乱码问题
2012-09-11 14:12 3120第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特 ... -
【转】说说字符集和编码
2012-09-10 22:41 784很久很久以前,有一 ... -
【转】解决get方法传递URL参数中文乱码问题
2012-08-27 22:18 0来自:http://www.javaeye.com/top ... -
判断一个文本文件的编码格式
2012-08-27 17:40 0文件的字符集在Windows下有两种,一种是ANSI,一 ... -
【转】为什么用记事本保存的UTF-8格式的java文件不能编译通过?
2012-08-27 17:26 0Windows记事本默认保存的ANSI格式,java编 ... -
Eclipse中的Text File Encoding与文本文件的编码的关系
2012-08-27 17:25 1486当我们编写一个txt文件或jsp页面时,我们用默认的一种编码区 ... -
【转】有关保存文件时的编码选项与html/jsp页面设定字符编码的配置
2012-08-27 16:10 759分两种情况介绍 注:首先,各位得对一次 请求/响应 的 ... -
【转】内码转换技术
2012-08-27 16:04 0内码转换技术 好吧 ... -
【转】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
2012-08-27 13:25 955这两天抽时间又总结/整理了一下各种编码的实际编码方式, ... -
【转】又一篇介绍计算机字符编码的好文——计算机中的字是如何处理的?
2012-08-26 21:50 0如果你用放大镜看一下,可以看出屏幕上的字是由一个一个的像素点组 ... -
【转】利用javascript完成URLEncoding功能
2012-08-27 11:25 747日常开发中,经常遇到由于页面不一致,导致由页面表单提交或超连接 ... -
【转】Java编码规范,在您进行编码之前应该阅读的规范
2012-08-27 11:25 821本文转载于:http://www.web3d.com. ... -
【转】第三篇:JAVA字符编码系列三:Java应用中的编码问题
2012-08-26 21:42 804这部分采用重用机制,引用一篇文章来完整本部分目标。 来源 ... -
【转】第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码
2012-08-26 21:17 9491、函数介绍 在Java中,字符串用统一的Unico ... -
【转】java 与 iso-8859-1 编码
2012-08-26 21:16 1543今天又研究了一下字符编码。写了些测试代码,算是比较了解了。 主 ... -
【转】TOMCAT中文问题,解决(全)(转载)
2012-09-11 14:30 690TOMCAT中文问题解决了.其他应用服务器的问题也可以 ...
相关推荐
本文将纠正“关于'form表单提交数据编码方式和tomcat接受数据解码方式的思考'”一文中可能存在的错误,并深入探讨相关知识点。 首先,表单数据的编码方式主要取决于`<form>`标签的`enctype`属性。默认情况下,如果...
本篇将详细介绍如何使用Servlet来接收form表单提交的数据,并将其在网页上呈现。 一、Servlet生命周期 Servlet具有三个主要阶段:加载、初始化和服务。当客户端首次请求Servlet时,服务器会加载并初始化Servlet,...
在HTTP协议中,表单数据默认使用ISO-8859-1编码,而我们可能期望的是UTF-8或者其他支持多语言的编码方式。为了解决这个问题,我们可以利用Java的Servlet过滤器(Filter)机制来处理请求。 1. **创建过滤器**: 在...
2. **设置表单提交编码**:对于POST方式提交的表单,需要在Servlet处理请求之前,通过`HttpServletRequest`的`setCharacterEncoding`方法设定请求的字符编码。如示例代码中的`req.setCharacterEncoding("utf-8")`,...
2. **Form认证**:Form认证是更安全且用户友好的方式,它引导用户通过一个登录表单提交凭据。Tomcat使用Jaas(Java Authentication and Authorization Service)来处理这些凭据。 下面,我们将详细介绍如何配置和...
在本文中,我们将深入探讨如何使用POST方式提交数据到Tomcat服务器。POST方式与GET方式在创建Web工程时虽然基本架构相同,但在处理请求时有显著的区别。POST方式主要用于发送大量或敏感的数据,因为它可以携带的数据...
【使用Get方式提交数据到Tomcat服务器的方法】 在Web开发中,向服务器发送数据是常见的需求,而HTTP协议提供了两种主要的方式:GET和POST。本文将重点讲解如何使用GET方式向Tomcat服务器提交数据,并接收处理结果。...
用户在JSP页面填写表单后,提交数据到同一页面。此时,JSP页面可以调用JavaBean的相应方法处理这些数据,而不是像传统方式那样提交到另一个URL。 在JSP页面中,使用`<jsp:useBean>`指令实例化JavaBean,然后通过`...
当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,它们是: 1、BASIC(基本验证):通过HTTP验证,需要提供base64编码文本的用户口令 2、DIGEST(摘要...
1. **表单提交数据**:确保表单的`enctype`属性设置为`application/x-www-form-urlencoded`或`multipart/form-data`。默认情况下,`enctype`为`application/x-www-form-urlencoded`,这时POST提交的数据会使用UTF-8...
在B/S架构中,客户端浏览器向服务器提交数据主要有两种方式:表单(Form)提交和Ajax异步请求。对于表单提交,浏览器会根据操作系统的默认编码(如GBK)对输入数据进行编码。而在Ajax请求中,情况有所不同,...
1. Tomcat5默认使用ISO-8859-1编码处理表单(POST)提交的数据。 2. 对于GET请求,Tomcat5采取不同于POST请求的处理方式,导致设置`REQUEST.setCharacterEncoding("GBK")`无效。 **解决办法:** **方法一:实现...
##### 3.1 设置表单编码 为了避免POST请求中的中文乱码问题,可以在HTML表单中明确指定`charset`属性,确保表单数据使用正确的编码格式。例如,在HTML表单标签中添加`charset="UTF-8"`属性。 ```html <form action...
- 修改`server.xml`:Tomcat的主配置文件中,可以在`<Connector>`标签内设置`URIEncoding`属性来指定请求的编码方式,例如`URIEncoding="UTF-8"`。 - 配置`context.xml`:对于特定的Web应用,可以在`META-INF/...
GET方式提交中文数据时,由于Tomcat默认使用ISO-8859-1编码URL参数,同样可能导致乱码。解决方法包括: - **解码转换**:在服务器端对GET参数进行解码再转码,如上所述。 - **修改Tomcat配置**:在`server.xml`的...
4. **处理表单提交数据**:对于表单提交的数据,可以通过设置合适的编码格式来避免乱码。 #### 三、具体解决步骤 根据题目描述中的部分代码片段,我们可以看到一个`Connector`元素的配置,其中有一个属性`...
1. **设置请求编码**:在Servlet的`doGet`方法中,我们可以手动指定请求参数的编码方式。例如,使用`HttpServletRequest`的`setCharacterEncoding`方法来设定请求的字符编码: ```java request.setCharacter...
2. **表单提交编码问题**:HTML表单提交数据时,如果没有明确指定编码方式,可能会使用默认的ISO-8859-1编码,而服务器端可能期望的是UTF-8编码。 3. **数据库连接编码设置**:数据库连接时,如果字符集没有正确设置...