Web实际应用中的编码问题

一、 JSP页面有关编码的介绍

---->>假设不做不论什么设置,页面默认ISO-8859-1编码(Western European)。

---->><%@ page contentType="text/html; charset=UTF-8" %>

等同于response.setContentType("text/html; charset=UTF-8"); 这里对ContentType进行说明下

这里的ContentType是response的ContentType,意思就是告诉浏览器

我的数据是text/html,编码是UTF-8,因此浏览器会以UTF-8的编码进行展示。

---->> <%@ page pageEncoding="UTF-8" %>

1.等同于告诉Eclipse我这个页面以什么编码方式存储

当然你能够改动jsp页面的编码方式,使其和pageEncoding不一样。

Eclipse的编码有一个默认方式,叫determine from content type

也就是说内容是怎么编的,我就怎么来。你要改动它也拿你没办法不是.

2.同一时候告诉Tomcat以什么方式读取这个JSP页面(这里大家有疑问。我问候再解释)

---->>在<%@ page %>中假设没有contentType则依据pageEncoding产生contentType

如果pageEncoding="UTF-8"则默觉得response.setContentType("text/html;charset=utf-8")

如果pageEncoding="GBK"则默觉得response.setContentType("text/html;charset=gbj")

---->>在<%@ page %>中假设没有pageEncoding则依据contentType的charset来编码

相同的假设没有pageEncoding则默认pageEncoding为contentType的charset.

这里pageEncoding起的作用是告诉Tomcat这个JSP文件以什么编码读取。

---->><meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type" />

---->><meta charset="UTF-8" >

这两个是HTML标签。

。假设response的header上没有ContentType。

则浏览器会以这两个的编码进行展示.可是。看以下。

。。

在JSP中 假设<%@ page %> 没有contentType和pageEncoding。

则默认response.setContentType("text/html")

这就意味着默认编码是ISO-8859-1所以JSP中meta的charset和contentType无效。

---->>request.setCharacterEncoding("GBK");

此方法是设置从浏览器端传过来数据的编码方式。

注意该方法仅仅对POST的数据有效。

---->>resp.setContentType("application/json;charset=ISO-8859-1");

此处的编码对于浏览器的编码无影响。即假设用的是中文,charset=UTF-8或者GBK

对浏览器都不会产生乱码。

仅仅要不是在中文的情况下使用ISO就能够.

---->>resp.setCharacterEncoding("GBK");

这里的作用是设置返回给浏览器内容的编码方式,并能够设置页面的编码。

前提是该请求是进行页面的跳转,假设是ajax请求数据,数据的编码方式则跟

ajax请求发出的页面的编码方式同样。

默认情况下页面是以ISO编码,假设数据中存在中文则默认改为GB2312,假设

此时的编码方式为UTF-8。则会产生乱码。

注意:在servlet中设置中文的编码和该servlet相应java文件保存的编码方式无关。

二、 数据从server到浏览器的传输

这里我先做一个简单的架构。A代表浏览器,B代表server(Tomcat)。

B上面执行着很多Servlet.每个Servelt可能编码不一样。

(这里Servlet的编码指的是Servlet的java文件在系统上的编码).

每一个Servelt的编码事实上不影响他在服务浏览器时对编码产生的影响。

这就好比两个不同编码的Servlet,当我们用文本打开时能够看到它们都拥有"中国"的字符

它们在硬盘上保存的二进制可能是不同的,当它们对"中国"以UTF-8进行编码时产生的字节码是一样的

在Tomcat看来JSP也是一个Servlet,比如我们有一个index.jsp则相应一个index_jsp.java。

这里我不正确Tomcat的内部原理进行具体解释。大家仅仅要知道index_jsp.java是一个Servlet就可以。

A请求B,B上的Servlet没有乱码,而且告诉A你应该以什么方式展示(ContentType)则没有乱码

乱码最easy出现的地方是当我们訪问jsp的时候。大多数时候在index_jsp.java中已经是乱码了

还记得我说过<%@ page pageEncoding="UTF-8" %>的两个作用,当中第二个作用是告诉Tomcat

以什么方式读取jsp文件,也就是说pageEncoding的编码与实际index.jsp页面的编码一致时,

生成的index_jsp.java文件中就没有乱码。有兴趣大家去看Tomcat源代码。

注:

contentType和pageEncoding的互相替代作用上面说过,不做解释了。

当contentType和pageEncoding都有时,contentType为utf-8,pageEncoding为gbk

而且index.jsp以gbk编码,也不会出现乱码.

三、 数据从浏览器到server的传输

数据从浏览器到server传输时。其编码方式以当前浏览器页面的编码方式同样。

即页面是UTF-8编码就是UTF-8。是GBK就是GBK。

在Serlvet中能够通过设置request.setCharacterEncoding("GBK");对数据进行解码。

但这样的方式仅仅对通过post方式上传的数据有效。

get方式的编码默觉得ISO-8859-1。

get方式有两种情况:一种是在地址栏直接输入,还有一种是页面url跳转。以下分情况讨论下

------>>页面url跳转方式: 这里三种提供get方式乱码问题的解决的方法:

1.在tomcat的server.xml中改动

2.Serlvet中获取參数new String(request.getParameter("key").getBytes("ISO-8859-1"),"Encoding")

另外一种方式在具体说明一下。在get方式发送请求时,是按页面的编码方式对数据进行编码。

当请求发送到tomcat之后,会默认以ISO-8859-1的编码进行解码。

因此我们须要以ISO的编码进行还原,

在是页面的编码进行编码,所以这里的Encoding设置的是页面的编码方式。

3.使用Tomcat8

首先不建议get方式传中文,假设须要使用另外一种解决方案。

------>>地址栏直接输入:假设url带有中文则默认先UTF-8编码。再ISO-8859-1.

与页面的url不同的是 页面的get方式编码取决于页面编码,地址栏浏览器默认utf-8.

四、 温馨提示

假设大家看Tomcat源代码,想了解jsp是怎样形成index_jsp.java文件的。

建议大家看几个文件:Compile.java,Generator.java,PageInfo.java,ParserController.java

以上我说的编码亲測有效,假设有什么出入的地方。欢迎交流。

原创摘自:http://beadlechen.github.io/content/blog.html#category=software#article=encode3

时间: 2024-11-10 13:09:15

Web实际应用中的编码问题的相关文章

Spring在web.xml请求中定义编码(org.springframework.web.filter.CharacterEncodingFilter)

<!-- Filter 定义 --> <!-- Character Encoding filter --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <p

web.xml 中以编码方式添加filter并设置初始化参数AbstractAnnotationConfigDispatchServletInitializer

web.xml中配置filter <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入

大多数脚本利用发生在用户可以将可执行代码(或脚本)插入您的应用程序时. 默认情况下,ASP.NET 提供请求验证.只要窗体发送包含任何 HTML,该验证都会引发错误. 您可以使用下列方法防止脚本利用: 对窗体变量.查询字符串变量和 Cookie 值执行参数验证. 该验证应包括两种类型的验证:可以将变量转换为所需类型(如转换为整数.日期时间等)的验证,以及所需范围或格式的验证. 例如,应该使用 Int32.TryParse 方法来检查应为整数的窗体发送变量,以验证该变量是否确实为整数. 而且,还应

Java web中常见编码乱码问题(二)

根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码,应该先检测系统编码是什么样的,看看是否支持中文编码的字符集. System.out.println(System.getProperty("file.encoding")); a1.如果是不支持中文的就要设置jvm编码了,设置方法: Windows环境就在catalina.bat配置: s

web.xml文件中的7个错误的安全配置

关于Java的web.xml文件中配置认证和授权有大 量 的 文章.本文不再去重新讲解如何配置角色.保护web资源和设置不同类型的认证,让我们来看看web.xml文件中的一些常见的安全错误配置. (1) 自定义的错误页面没有配置 默认情况下,Java Web应用在发生错误时会将详细的错误信息展示出来,这将暴露服务器版本和详细的堆栈信息,在有些情况下,甚至会显示Java代码的代码片段.这些信息对为他们的病毒需找更多信息的黑客来说是一种恩惠.幸运的是,通过配置web.xml文件来展示自定义的错误页面

web开发技术中Servlet技术的概述

1.servlet是什么:servlet是一个位于服务器端的java应用程序它可以像jsp一样,直接输出信息 servlet类必须继承HttpServlet类,否则,不能称为serlvet servlet类是一个java类,但是有自己的规则servlet必须在web.xml文件中注册服务器在启动的时候,可以根据这些配置来加载servlet类....... 2.servlet作用:C:控制层serlvet主要用来做控制转发,需要结合到MVC模式(套路) 3.servlet生命周期:initserv

web开发实践中遇到的问题--spring mvc中文乱码

jsp页面中文输入,到controller乱码,这时候需要设置的是在web.xml文件中添加一个编码的过滤器(filter)将编码统一为UTF-8.代码: <!-- jsp提交中文表单,controller中解决中文乱码问题--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.Char

网络编程中的编码问题汇总

应用程序中的编码问题让人头疼,一直是这样,今天下午就被数据库编码错误搞的头疼不已. 那么,就决心好好总结一下编码带来的问题,争取让自己对整个编码体系有一个清晰的认识. 从编码问题的产生说起 我们知道,计算机是美国人发明的,人家的英语体系总从来就只有26个英文字母和一些数字.特殊字符等,为了储存文字信息,于是使用了最早的ascii码进行字符编码.而后来由于计算机的普及,多国语言文字变得重要起来,于是多语言的特性成为了计算机的必备,各国进行各国的国家标准编码,中国的便是GB2312(1980年),而

Web渗透:PHP字符编码绕过漏洞总结

其实这东西国内少数黑客早已知道,只不过没有共享公布而已.有些人是不愿共享,宁愿烂在地里,另外的一些则是用来牟利. 该漏洞最早2006年被国外用来讨论数据库字符集设为GBK时,0xbf27本身不是一个有效的GBK字符,但经过 addslashes() 转换后变为0xbf5c27,前面的0xbf5c是个有 效的GBK字符,所以0xbf5c27会被当作一个字符0xbf5c和一个单引号来处理,结果漏洞就触发了. mysql_real_escape_string() 也存在相同的问题,只不过相比 adds