1.前言

  相信很多初学者在学习javaWeb基础知识时,总会遇到各种各样的乱码问题,我也是从那个时候过来的。当时遇到各种乱码问题,只能通过面向百度的方式,解决各种乱码问题,乱码虽然问题能解决,但是总是知其然不知其所以然。如果你也存在一些疑惑,并且仔细阅读这篇文章,我相信我会帮助到你。

2.请求参数传递乱码问题

解决的办法

  先看参数传递方式

    1.form表单(get提交)、url传参、超链接在这里我统归于get参数传递方式

    2.form表单(post提交)、request请求转发在这里我统归于post参数传递方式

  再看Tomcat版本号

    1.Tomcat 8及以上版本

    2.Tomcat 8以下版本

举例:

  example1:get参数传递方式 + Tomcat 8 以下版本 

  这种情况下,会出现乱码问题,讲清楚这个东西,需要先了解一个Tomcat的连接器组件(Connector):

  Connector是Tomcat中的一个重要的组件,它负责监听Tomcat收到的请求信息,并将这些请求信息传递给Servlet规范中所定义的Request,然后将转换后的请求交给Engine组件去处理,最后将Engine返回的Response返回给客户端。

  Connector对象的构造方法在Tomcat 7.x的版本是这样的:

 1 protected String URIEncoding = null;
 2 public Connector(String protocol) {
 3         setProtocol(protocol);
 4         try {
 5             Class<?> clazz = Class.forName(protocolHandlerClassName);
 6             this.protocolHandler = (ProtocolHandler) clazz.newInstance();
 7         } catch (Exception e) {
 8             log.error(sm.getString(
 9                     "coyoteConnector.protocolHandlerInstantiationFailed"), e);
10         }
11 }

  在代码中我们并没有看到它去设置URIEncoding,那么在封装GET请求时,如果该字段的值为null,则会在解析的GET请求时,赋予默认值:ISO-8859-1,而ISO-8859-1是不包含中文的,所以自然会出现中文乱码,这个时候,我们可能会尝试使用这种下面方式处理乱码问题:

request.setCharacterEncoding("utf-8");

  但是,在 get参数传递方式 + Tomcat 8 以下版本 这种环境下,上面的方式处理不了乱码问题,遇到这种情况,通常解决方式有两种:

  1.如果方便找到Tomcat 的配置文件,修改Tomcat的配置文件(conf/server.xml)

    Tomcat 的server.xml配置文件有这样一段: 

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

    在Connector这个标签内,是没有URIEncoding这个属性的,那么加上这个属性更改为:

<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />

    重启Tomcat服务器,就能解决了。

  2.获得参数前进行编码方式转换

    当使用一些内置的Tomcat服务器(例如MyEclipse中内置了Tomcat服务器),修改配置文件显然不是一个好方式,反正我是没找到MyEclipse的Tomcat配置文件。。。又或者不想使用上面的方式,那么这个时候可以使用下面这种方式:

    例如:想要获得表单传递过来的一个username参数,可以进行下面的操作:

String username = new String (request.getParameter("username").getBytes("iso8859-1"),"utf-8");

    这样username的值就不会是乱码了。

  example2:get参数传递方式 + Tomcat 8 及以上版本 

  在这种情况下,不会出现乱码问题,还是上面的Tomcat 组件Connector,在Tomcat 8 中该对象的构造方法为:

 1 protected String URIEncoding = null;
 2 public Connector(String protocol) {
 3         setProtocol(protocol);
 4         ProtocolHandler p = null;
 5         try {
 6             Class<?> clazz = Class.forName(protocolHandlerClassName);
 7             p = (ProtocolHandler) clazz.getDeclaredConstructor().newInstance();
 8         } catch (Exception e) {
 9             log.error(sm.getString(
10                     "coyoteConnector.protocolHandlerInstantiationFailed"), e);
11         } finally {
12             this.protocolHandler = p;
13         }
14
15         if (!Globals.STRICT_SERVLET_COMPLIANCE) {
16             URIEncoding = "UTF-8";
17             URIEncodingLower = URIEncoding.toLowerCase(Locale.ENGLISH);
18         }
19     }

  与上面的Tomcat 7中的Connector构造器对比就可以发现,URIEncoding的默认值为UTF-8,所以get方式请求传递的中文参数我们就不需要处理了。

  

  example3:post参数传递方式 + Tomcat

  使用post参数传递方式,无论是Tomcat 8 版本前后,都需要进行乱码处理,通过网络抓包,我们可以看到post方式传递的参数会放在请求体中,这也是与get方式的一点不同之处(get方式传递的参数从url地址栏中能看到,是放在请求行中的),处理post方式的中文乱码,实际上是处理流的编码,说了这么多,其实只需要在获得参数前,加上这样一行代码即可:

request.setCharacterEncoding("utf-8");

  就会发现 post参数传递方式 + Tomcat 中文传参问题解决了。

3.响应数据乱码问题      

  响应数据乱码经常的表现形式是:浏览器接收到服务器端的响应数据后,呈现在页面,页面出现了乱码。

  这种解决方式很简单。

  直接 response.setContentType("text/html;charset=utf-8");

4.结语

  以上总结了关于一些常见中文参数传递乱码的解决方式,有什么问题可以留言,我们一起讨论。上诉总结如有不正确之处,希望能够指出,我定当认真修复,谢谢。

转载请注明出处!

参考:

https://www.jianshu.com/p/0ff9cbfc1cca

  

    

转载于:https://www.cnblogs.com/BoildWater/p/10896628.html

jsp和servlet开发过程中参数传递乱码问题总结相关推荐

  1. JSP和Servlet的六种中文乱码处理方法

    一.表单提交时出现乱码: 在进行表单提交的时候,经常提交一些中文,自然就避免不了出现中文乱码的情况,对于表单来说有两种提交方式:get和post提交方式.所以请求的时候便有get请求和post请求.每 ...

  2. java菱形乱码 编码_【分享】Java开发过程中中文乱码问题总结

    一.文件乱码处理 1.文件默认编码:默认使用项目的默认编码 右击文件->Properties->Resource->Text file encoding 2.JSP文件编码:由于JS ...

  3. JSP和Servlet互相传输数据的过程中产生的乱码问题及解决方案(没有使用AJAX的情况)...

    一. 服务器端接收到浏览器端传送的数据出现乱码的问题!!!(Servlet端获取数据时出现乱码) 1. 为什么表单提交中文会出现乱码的问题?(非AJAX方式) 浏览器端:当表单提交时,浏览器会对中文参 ...

  4. jsp servlet mysql 乱码_关于jsp和servlet中的乱码问题

    在jsp和servlet的开发中,今天自己做的一个小例子中出现了中文乱码问题,用了许多方法,发现还是解决不了.最后我用了过滤器,才算终结. 此方法总结如下:在jsp页面中使用 ,这里的pageEnco ...

  5. JSP利用servlet上传文件时的中文乱码问题

    JSP处理乱码问题是一个痛苦的过程.这次servlet传送文件的乱码折腾了我至少两周. 总结如下: 1.第一类乱码: 就是文件传送过来的文件名等是乱码:但是servlet输出的页面汉字正常显示. 解决 ...

  6. SpringMVC开发过程中的中文乱码问题

    相信大家在开发初期遇到中文乱码问题一定是一头雾水,不是数据库乱码了就是页面乱码了或者传值时乱码.其实解决乱码的途径很简单,就是统一编码与解码的类型,我把自己遇到的乱码问题整理出来,希望能够对大家有用. ...

  7. jsp与servlet之间页面跳转及参数传递实例

    1.从一个jsp页面跳转到另一个jsp页面时的参数传递     (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plaincopy < ...

  8. 11. jsp与servlet之间页面跳转及参数传递实例

    1.从一个jsp页面跳转到另一个jsp页面时的参数传递     (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plain copy < ...

  9. .jsp与servlet之间页面跳转及参数传递实例

      1.从一个jsp页面跳转到另一个jsp页面时的参数传递     (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plaincopy &l ...

最新文章

  1. TENSORFLOW PROCESS FINISHED WITH EXIT CODE -1073741819 (0XC0000005)
  2. 面向对象的5个基本设计原则
  3. windows下安装emscripten
  4. OpenCV使用inRange的阈值操作Thresholding Operations
  5. POJ - 1584 A Round Peg in a Ground Hole(综合几何)
  6. 力扣 ---- java
  7. 贺利坚老师汇编课程49笔记:call和ret
  8. Ajax中的get和post两种请求方式的异同
  9. [mysql终极优化]之主从复制与读写分离详细设置教程
  10. DB2数据库常用指令以及重要知识点学习
  11. MKV(Matroska)常见问题浅析
  12. 原型图工具功能比拼1
  13. google浏览器安装vuejs-devtools插件2022-4-25记录
  14. 降雪致国道315线部分道路通行受阻公路交警部门昼夜坚守
  15. 【Blender报错记录】Bone Heat Weighting: failed to find solution for one or more bones
  16. 微软服务器WIFI连不上吗,Win10系统为什么连不上WiFi?该如何解决?
  17. 计算机组成原理---实验报告
  18. CentOS联网(图解超详细)
  19. 计算机专业考研可以考哪些研究所,计算机专业考研可以考哪些专业
  20. python查看显存占用情况以及使用numba.cuda释放显存

热门文章

  1. [原]OpenCV2.2无法打开摄像头或读取视频的解决方法
  2. 登陆窗体显示动态效果
  3. 配置SQL Server 2005 Express的身份验证方式,以及如何启用sa登录名。
  4. Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据
  5. 数据结构1:单链表反转java代码解释
  6. python微信好友分析源代码_搞事情了 | 教你用Python分析微信好友信息(内附完整代码)...
  7. python零基础入门大数据_【资源分享】零基础入门大数据(数据分析)经验分享...
  8. mysql 同步 存储过程_mysql 存储过程 实现数据同步
  9. android浮动文本,android – 如何将文本添加到浮动操作按钮?
  10. python链表的创建_《大话数据结构》配套源码:链表(Python版)