`

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");

分享到:
评论

相关推荐

    JSPServlet 中的汉字编码问题

    - 在Servlet中处理请求时,可以使用`request.setCharacterEncoding("UTF-8")`来设置请求参数的编码格式。 - 在响应中,可以使用`response.setContentType("text/html; charset=UTF-8")`来指定响应内容的编码格式。...

    Web编程(Java )-Servlet API中请求和响应的应用.doc

    在Web编程中,Java Servlet API是用于开发动态Web应用程序的核心技术之一。本实验主要探讨了如何使用Servlet API处理客户端的HTTP请求以及响应。实验的主要目标是实现一个简单的用户注册功能,涉及了表单数据的接收...

    Servlet的WEB工程配置文件说明

    在Java Web开发中,`web.xml`文件是Web应用程序的核心配置文件之一,它主要用于定义Web应用的结构与行为,特别是Servlet的相关配置。本文将深入解析`web.xml`文件中的关键元素及其作用,并结合示例进行详细说明,...

    JSP和Servlet中的几个编码的作用及原理

    在Web开发中,特别是使用Java Server Pages (JSP) 和 Servlet 技术时,处理字符编码问题至关重要。不当的编码设置会导致用户界面上出现乱码,影响用户体验。本文将深入探讨JSP和Servlet中的几个关键编码设置的作用及...

    JSP-Servlet中的汉字编码问题-JSP教程

    在Web开发中,尤其是在使用JavaServer Pages (JSP) 和 Servlet 进行页面处理时,字符编码问题是经常遇到的技术难题之一。本文将围绕“JSP-Servlet中的汉字编码问题”这一主题展开讨论,通过对相关知识点的深入剖析,...

    Servlet编码过滤器的实现

    // 设置请求编码 response.setCharacterEncoding(encoding); // 设置响应编码 chain.doFilter(request, response); // 继续过滤链 } @Override public void destroy() { } } ``` 在这个`EncodingFilter`中...

    jsp页面中获取servlet请求中的参数的办法详解

    在Java Web应用程序中,Servlet和JSP是两个关键组件,它们协同工作来处理客户端的请求并展示响应。本文将深入探讨如何在JSP页面中获取Servlet请求中的参数,并将其传递到另一个JSP页面。 首先,我们需要配置`web....

    servlet 编码

    1. 设置请求编码:使用HttpServletRequest的setCharacterEncoding()方法设置请求编码。 ```java req.setCharacterEncoding("UTF-8"); ``` 2. 设置响应编码:通过HttpServletResponse的setContentType()方法设置响应...

    JSP在Servlet中的几个编码的作用及原理

    2. **请求编码**: 当用户通过表单提交数据时,这些数据会被浏览器按照其指定的字符集(通常是`Content-Type`头字段指定的)编码。Servlet容器(如Tomcat)接收到请求后,需要正确解码这些数据。可以通过在Servlet...

    servlet作为服务器响应请求.zip

    Servlet是Java Web开发中的核心组件,它主要用于处理客户端(如浏览器)发送的HTTP请求,并生成相应的HTTP响应。在本示例中,"servlet作为服务器响应请求.zip"包含了一个实现登录注册界面的Servlet应用,这将帮助...

    简单的web开发——servlet案例

    Servlet是Java Web开发中的重要组成部分,它是一种用于扩展服务器功能的Java类,通常用来处理HTTP请求并生成动态响应。 ### 1. 什么是Servlet? Servlet是一个Java接口,由Java Servlet API定义。它允许程序员创建...

    servlet中文乱码问题

    - 在Servlet中处理HTTP请求时,可以通过`request.setCharacterEncoding()`方法设置请求参数的字符编码,以确保从请求中获取的数据正确解码。 ```java request.setCharacterEncoding("utf-8"); ``` 4. **转换...

    JAVA WEB中的Servlet过滤器

    在Java Web开发中,Servlet过滤器(Filter)是不可或缺的一部分,它允许开发者在请求到达Servlet之前或响应离开Servlet之后对其进行处理。Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后...

    超强过滤器彻底解决JSP-SERVLET中文参数GET-POST传递的问题(转)

    - 对于GET请求,可以在Servlet中使用`request.setCharacterEncoding("UTF-8")`来设定请求编码,但这只对POST请求有效,因为GET请求的编码在请求发送前就已经确定。 - 对于POST请求,由于在读取请求参数前可以设置...

    Servlet请求和响应的资料,帮助初学者掌握Servlet的请求和响应

    在本文中,我们将深入探讨Servlet请求和响应的工作原理,以及Web容器的角色。 首先,Web容器(如Tomcat, WebLogic, WebSphere)是Servlet和JSP的运行环境,它管理这些组件的生命周期,包括初始化、服务和销毁,并...

    Jsp和Servlet中文乱码问题

    3. **Servlet中的编码处理不当**:在Servlet中读取请求参数时,如果没有正确的编码转换,也可能导致乱码。 ### 解决方案 #### 1. 配置Tomcat服务器 根据提供的部分内容,可以看到对Tomcat服务器的`server.xml`...

    jsp+servlet+mysql乱码解决的这天

    8,控制器servlet中的请求编码格式为utf-8,数据库连接url中添加useUnicode=true&characterEncoding=UTF-8参数,编写filter过滤器设置请求和响应的编码格式为gb2312,最后配置web.xml文件中filter映射关系,来确保...

    Servlet JSP深入详解 基于Tomcat的Web开发

    Servlet和JSP是Java Web开发中的核心技术,它们与Tomcat服务器紧密相连,共同构成了Web应用程序的基础。本篇文章将深入探讨这三个关键概念,并介绍如何利用它们进行基于Tomcat的Web开发。 **Servlet概述** Servlet...

    Servlet中的Filter

    Servlet中的Filter是Java Web开发中的一个重要组件,它主要用于在Servlet处理请求之前或之后对请求和响应进行拦截和处理。Filter不直接处理用户请求,而是通过Filter链的方式串联多个Filter,形成一个处理流程。 1....

Global site tag (gtag.js) - Google Analytics