`
哈达f
  • 浏览: 120298 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

Tomcat在处理GET和POST请求时产生的乱码问题

 
阅读更多

  在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了。由于在JSP中使用了GBK作用页面的编码,那么提交的中文信息自然也会被按着GBK进行编码,为%xx格式的GBK编码。
  要解决这个问题可以说是方法多多。最简单的就是使用request.setCharacterEncoding方法设置编码格式,如下面的代码所示:
  request.setCharacterEncoding("GBK");
  在设置完编码格式之后,就可以直接通过request.getParameter方法来获得请求参数中的中文信息了。当然,为了方便,还可以在过滤器中加入上面的语句,这样所有的Servlet都可以直接使用 request.getParameter方法来获得请求参数中的中文信息了。 除了这两种方法,还可以不使用request.setCharacterEncoding("GBK"),而使用下面的语言来转换编码:
  String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
  但为了更快解决这个问题,我就直接告诉这位朋友使用了setCharacterEncoding方法来设置编码。但是说来奇怪,还是出现乱码,没有任何解决问题的迹象。 最郁闷的事就是使用了自己认为100%能解决问题的方法,而这种方法却一点都没起作用。
  最后又试了最后一种方法,说来奇怪,竟然好使了。当然,这也没什么可奇怪的,本来就应该好使,但奇就奇在setCharacterEncoding方法并没有去掉,也就是说,同时使用了下面两条语句,竟然得到了正常的中文请求参数值:
  request.setCharacterEncoding("GBK");
  String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
  System.out.println(name); // 正常输出中文请求参数
  按着常理来说,这是不可能的,既然使用了setCharacterEncoding方法设置成了GBK,再使用new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")来转换,得到的应该是?????,不可能是正常的中文,只有将setCharacterEncoding方法去了,以ISO-8859-1格式保存的字符串才可以用ISO-8859-1格式还原,再用GBK重新保存成Java字符串(这一步实际上就是GBK转Unicode)。
  但经过仔细思考后,决定看下JSP代码是如何写的。不看不知道,一看吓一跳,原来

在提交时使用的是GET,而未用POST,这当然没什么了不起的,用什么都可以,但对编码就有问题了。自从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");
  综上所述,如果使用了GET请求,则setCharacterEncoding方法不起作用,只能使用上面的代码来解决,而使用POST请求,尽管setCharacterEncoding方法起作用,但使用上面的代码仍然好使(在这时不能使用setCharacterEncoding方法将编码格式设置成非iso-8859-1格式)。因此,如果想让Servlet可以同时处理GET和POST请求中的中文信息,除了判断这两种方法外,还可以使用上面的代码来同时处理这两种请求的中文信息。
  考试大建议使用如下的代码来获得中文请求参数:
  String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
  因为上面的代码是利用了Java的编码能力,对于所有的Web服务器都会有效,而setCharacterEncoding方法是通过Web服务器支持的,并不是所有的Web服务器都会对该方法有很好的支持。  request.setCharacterEncoding():是设置从request中取得的值或从数据库中取出的值。     指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。 get需在Tomcat的server.xml中的: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK" /> )加入URIEncoding="GBK",解决get请求乱码问题     response.setContentType("text/html;charset=gb2312")是设置页面中为中文编码。     前者是设置动态文字(参数,数据库),后者设置页面静态文字 response.setContentType指定 HTTP 响应的编码,同时指定了浏览器显示的编码.  response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置.与response.setContentType相同的是,调用此方法,必须在getWriter执行之前或者response被提交之前.

 

分享到:
评论

相关推荐

    Tomcat中Get和Post出现乱码的解决办法

    在 Tomcat 中,Get 和 Post 方法都可能出现乱码问题,这主要是由于编码问题引起的。在本文中,我们将详细介绍 Tomcat 中 Get 和 Post 方法出现乱码的解决办法。 一、乱码问题的出现 在 JSP 程序中,当我们使用 GET...

    解决post get 请求乱码问题

    解决 POST GET 请求乱码问题 在 Web 开发中,POST 和 GET 请求可能会出现乱码...解决 POST 和 GET 请求乱码问题需要对服务器和应用程序进行配置和编码处理。在实际开发中,我们需要根据具体情况选择合适的解决方法。

    SpringMVC解决GET请求时中文乱码的问题.rar

    浏览器在构建这个URL时,会按照默认的字符集(非UTF-8)对中文参数进行编码,而Spring MVC在处理请求时,默认可能并未正确设置解码方式。 2. 字符编码:HTTP协议允许服务器和客户端之间约定字符编码,但如果没有...

    完美解决Get和Post请求中文乱码的问题

    在处理POST请求时,确保调用`setCharacterEncoding`方法;处理GET请求时,需要手动对URL参数进行解码。同时,配置服务器的编码设置也是避免乱码的有效手段。通过这些方法,可以有效地解决Web开发中的中文乱码问题。

    解决Tomcat修改get提交请求乱码问题

    本文主要讨论如何解决Tomcat在处理GET提交请求时出现的乱码问题。 首先,我们要明白GET请求与POST请求的区别。GET请求通常用于获取资源,而POST请求则用于向服务器发送数据。对于POST请求,Spring框架提供了`...

    03.SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢.zip

    在Spring MVC框架中,处理POST和GET请求时可能会遇到中文乱码的问题,这通常是由于字符编码设置不正确导致的。本文将详细阐述如何解决这些问题。 首先,我们需要理解HTTP请求中的编码原理。HTTP协议本身并不规定...

    Tomcat PostGet 中文編碼處理方法

    在Web应用开发过程中,中文字符编码问题一直是个常见的技术难题,尤其是在处理HTTP请求中的POST和GET方法时。对于使用Apache Tomcat服务器的应用程序来说,确保中文字符正确编码是提升用户体验、避免数据损坏的关键...

    如何解决Tomcat下中文乱码问题?

    在IT行业中,尤其是在Java Web开发领域,Tomcat服务器在处理中文字符时经常遇到乱码问题。这主要涉及两个方面:JSP页面显示中文乱码和表单提交乱码。为了解决这些问题,我们需要理解字符编码的基本原理,并采取相应...

    java乱码综合解决方法(不区分get和post)

    Java中的乱码问题是一个常见的编程挑战,特别是在处理网络请求(如GET和POST)时。本文将深入探讨如何解决这些问题,并且不局限于特定的请求类型。首先,我们需要理解字符编码的基本概念,然后分析Java中可能出现...

    Tomcat和weblogic中文乱码问题解决方案

    Tomcat和WebLogic中文乱码问题解决方案 在 Java Web 开发中,中文乱码问题一直是困扰开发者的主要问题之一。 Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时...

    解决tomcat中文乱码问题.doc

    通过上述步骤,无论用户提交的数据是以GET还是POST方式发送的,都能正确地以GBK编码进行解码,从而避免乱码问题。 #### 三、额外处理 对于某些特殊情况,如直接从数据库中读取中文数据时也可能遇到乱码问题。此时...

    解决tomcat中文乱码问题

    ### 解决Tomcat中文乱码问题的详尽指南 ...以上步骤和技巧覆盖了在Tomcat环境下处理中文乱码的主要场景,遵循这些建议可以有效避免或解决中文乱码问题,确保中文字符在Web应用中的正确展示和处理。

    J2EE以GET和POST方式提交表单的乱码解决(受教了)

    然而,在处理中文字符时,可能会遇到乱码问题。这个问题通常涉及到字符编码的设置和处理,尤其是对于从表单提交的数据。下面我们将深入探讨如何解决J2EE环境下GET和POST方式提交表单时出现的乱码问题。 首先,我们...

    Struts2中文乱码问题最终解决方案

    然而,中文乱码问题一直是困扰开发者的一个常见问题,特别是在处理POST和GET请求时。以下是对标题和描述中涉及知识点的详细解释: 1. **StrutsPrepareAndExecuteFilter**: Struts2框架中的`...

    tomcat request.getParameter 乱码

    通过对Tomcat服务器的适当配置,可以有效地解决`request.getParameter`方法在处理中文参数时出现的乱码问题。具体而言,通过在`server.xml`文件中修改`Connector`元素的相关属性,以及在程序中设置合适的字符编码,...

    java开发乱码问题处理大全

    在Java开发中,乱码问题是开发者常遇到的挑战之一,尤其是在处理多语言、跨平台应用时更为显著。本文将深入探讨Java开发中常见的乱码问题及其解决策略,帮助你迅速掌握处理乱码的技巧,提升开发效率。 #### 一、...

    JAVA过滤器filter request.setCharacterEncoding仅对POST提交起作用,对GET提交还是会出现乱码问题

    在Java Web开发中,字符编码问题常常困扰着开发者,尤其是当涉及到HTTP请求的处理时。标题和描述中提到的问题——"JAVA过滤器filter request.setCharacterEncoding仅对POST提交起作用,对GET提交还是会出现乱码问题...

    Tomcat中文乱码处理方法.docx

    Tomcat中文乱码处理方法是指在使用Tomcat服务器时,遇到中文乱码问题的解决方法。中文乱码是指在网页中显示的中文字符被错误地显示为乱码,影响用户体验和网站的可读性。 第一种解决方法是通过contentType、...

    乱码问题的解决

    在本文中,我们将详细介绍乱码问题的原因、类型和解决方法。 一、编码不一致的原因 编码不一致是乱码问题的主要原因。编码不一致可能出现在多个方面: * 页面编码:jsp 默认 iso8859-1 * 服务器编码:tomcat 默认...

Global site tag (gtag.js) - Google Analytics