`

Servlet中web请求的编码

阅读更多

Servlet中Web请求的编码是一个很伤脑筋的问题。使用多个Servlet容器的人一定知道,每个容器的缺省编码不一定一样。比如说,Jetty和Tomcat就不一样。很多人都喜欢在Jetty上进行开发,最终产品在Tomcat上运行。这个编码的差别很有可能在最后测试的时候给你一个不大不小的惊奇 - 一个伤脑筋的惊奇。

当用户从浏览器发送请求的时候,浏览器根据页面的编码,对参数进行编码。然后,把编码后的字节用ISO-8859-1进行编码然后传送给服务器。以UTF-8作为例子,在表单里的字符串“中国”,传送到服务器的过程是:

浏览器
“中国” => UTF-8 Encoding(“中国”)=> ISO-8859-1 Encoding(UTF-8 Encoding(“中国”))

服务器
ISO-8859-1 Encoding(UTF-8 Encoding(“中国”)) => UTF-8 Encoding(“中国”) => “中国”

问题是,服务器需要知道原始的编码,才能得到正确的字符串。你可能以为请求里面应该有足够的信息让服务器能够正确解码。但现实状况是,没有。

首先说一下请求的类型。GET和POST都可以用来传送参数。差别是,在GET中参数是URI上传送的;在POST中参数是在消息体(BODY)中传送的。同样,这两种方法的编码处理也是不一样的。在Tomcat 5.5中,两种方法的缺省编码都是ISO8859-1,也就是说,如果是UTF-8页面发送过来的请求,要是没有特别的指示的话,Tomcat会把它当作ISO-8859-1的字节,那得到的就是乱码了。

GET的编码可以在Tomcat的server.xml设置。下面把缺省的编码设置成UTF-8

<Server ...>
<Service ...>
<Connector ... URIEncoding="UTF-8"/>
...
</Connector>
</Service>
</Server>
POST的编码则是由请求里的setCharacterEncoding来设置。如果你使用getParameter来读取参数值,必须确保在没有任何getParameter调用之前就设置好编码了。一个方便的地方是Servlet 2.3的Filter。下面代码用了Spring提供的CharacterEncodingFilter来设置缺省为UTF-8。注意要尽量把这个Filter放到Filter链的最前面。虽然使用了Spring,但在常规的Servlet架构中定义一个Filter是同样的简单。

<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

最后一种情形,要是你不能更改Tomcat的server.xml怎么办?我的做法是,缺省使用ISO8859-1,读取参数值的时候,使用工具类而不是直接使用ServletRequest的getParameter。示范的转换代码如下:

byte[] stringBytesISO = isoString.getBytes("ISO-8859-1");
utf8String = new String(stringBytesISO, "UTF-8");

分享到:
评论

相关推荐

    Servlet 中文乱码解决工具类

    在Java Web程序开发中,由于Web容器内部使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据就会出现乱码的现象。由于Web容器使用了ISO-8859-1的编码格式,所以在Web应用的业务处理中也会使用ISO-...

    java-servlet-api.doc

    Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。 一个客户端程序,可以是一个Web浏览器,或者是非其他的可以连接上Internet的程序,它会访问Web服务器并发出请求。这...

    Java_Web总结

    Servlet 编码和部署是指将 Servlet 应用程序编写、编译、打包和部署到 Web 容器中的过程。该过程主要包括以下几个步骤: * 编写 Servlet 代码 * 编译 Servlet 代码 * 打包 Servlet 代码 * 部署 Servlet 应用程序到 ...

    servlet配置与使用

    Servlet 是一种基于 Java 语言的服务器端组件技术,用于生成动态 web 内容。下面是关于 Servlet 配置与使用的相关知识点: Servlet 生命周期 Servlet 的生命周期主要包括以下几个阶段: 1. 装载 Servlet: Server...

    JavaWeb Servlet中Filter过滤器的详解

    JavaWeb Servlet中Filter过滤器的详解 1.简述  Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制、过滤敏感词汇、压缩响应信息)。Filter能够对Servlet容器的请求和响应进行检查...

    java及web中英对照译文

    在JSP 的众多优点之中,其中之一是它能将 HTML 编码从 Web 页面的业务逻辑中有效地分离出来。用 JSP 访问可重用的组件,如 Servlet、JavaBean 和基于 Java 的 Web 应用程序。JSP 还支持在 Web 页面中直接嵌入 Java ...

    Servlet与JSP核心编程第2版

    4.2 在servlet中读取表单数据 4.3 示例:读取3个参数 4.4 示例:读取所有参数 4.5 参数缺失或异常时默认值的应用 4.6 过滤字符串中的html特殊字符 4.7 根据请求参数自动填充java对象:表单bean 4.8 当...

    V512工作室Java web的ppt

    V512工作室Java web的ppt ...第18章讲解与Java Web编程有关的主要的字符集和编码方法,还讲解了如何应对Java Web编程中出现的各种乱码问题。 第19章 讲解Java Web应用的目录结构和web.xml文件中主要元素的含义。

    java面试题web部分

    本文总结了Java web开发面试中的一些常见问题和答案,涵盖了forward和redirect的区别、JSP中的INCLUDE、应用服务器、数据连接池、JSP的内置对象、JSP指令、Servlet的生命周期等知识点。 一、forward和redirect的...

    Java™ Servlet 规范.

    1.4 Servlet 与其他技术的比较 ........................................................................................................................14 1.5 与 Java 平台企业版的关系 ......................

    深入分析Java Web技术内幕 修订版.pdf

    首先介绍前端知识,即在JavaWeb 开发中涉及的一些基本知识,包括Web 请求过程、HTTP、DNS 技术和CDN 技术。其次深入介绍了Java 技术,包括I/O 技术、中文编码问题、Javac 编译原理、class 文件结构解析、ClassLoader...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境...

    深入分析Java Web技术内幕高清PDF版.zip

    首先介绍前端知识,主要介绍JavaWeb开发中涉及的一些基本知识,包括Web请求过程、HTTP协议、DNS技术和CDN技术。其次深入介绍Java技术,包括I/O技术、中文编码问题、Javac编译原理、class文件结构解析、ClassLoader...

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》介绍了Web开发中客户端技术的基础知识,包括JavaScript、CSS、AJAX等,这些技术都是Web应用中常用的客户端技术。 《Java Web开发技术大全:JSP+...

    java web开发技术大全

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》介绍了Web开发中客户端技术的基础知识,包括JavaScript、CSS、AJAX等,这些技术都是Web应用中常用的客户端技术。 《Java Web开发技术大全:JSP+...

    JSP简易用户管理系统2.0

    由ServletFilter过滤器过滤所有请求,目的是修改编码格式 2.web.xml配置了所有请求 3.DeleteByIdServlet是单删的Servlet 4.DeleteServlet是批删的Servlet 5.ListServlet是列表展示的Servlet 6.LoginServlet是...

    ajax dwr 2.0 框架 jar包 中文官方文档 天涯浪子

    这些请求被发送给 DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成 JavaScript。DWR 还提供了帮助执行常见的用户界面任务的 ...

    java中文乱码解决问题

    有时候,我们在中文系统平台下开发的 Web 应用程序移植到英文系统平台下,在 Servlet 和 JSP 中直接书写的中文字符串在输出时,将显示为乱码。这是因为在编译 Servlet 类或者 JSP 文件时,如果没有使用 -encoding ...

    java web 开发详解

    Java 的 Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的...

    深入分析Java Web技术内幕 修订版

    首先介绍前端知识,即在JavaWeb 开发中涉及的一些基本知识,包括Web 请求过程、HTTP、DNS 技术和CDN 技术。其次深入介绍了Java 技术,包括I/O 技术、中文编码问题、Javac 编译原理、class 文件结构解析、ClassLoader...

Global site tag (gtag.js) - Google Analytics