jsp和servlet开发过程中参数传递乱码问题总结
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开发过程中参数传递乱码问题总结相关推荐
- JSP和Servlet的六种中文乱码处理方法
一.表单提交时出现乱码: 在进行表单提交的时候,经常提交一些中文,自然就避免不了出现中文乱码的情况,对于表单来说有两种提交方式:get和post提交方式.所以请求的时候便有get请求和post请求.每 ...
- java菱形乱码 编码_【分享】Java开发过程中中文乱码问题总结
一.文件乱码处理 1.文件默认编码:默认使用项目的默认编码 右击文件->Properties->Resource->Text file encoding 2.JSP文件编码:由于JS ...
- JSP和Servlet互相传输数据的过程中产生的乱码问题及解决方案(没有使用AJAX的情况)...
一. 服务器端接收到浏览器端传送的数据出现乱码的问题!!!(Servlet端获取数据时出现乱码) 1. 为什么表单提交中文会出现乱码的问题?(非AJAX方式) 浏览器端:当表单提交时,浏览器会对中文参 ...
- jsp servlet mysql 乱码_关于jsp和servlet中的乱码问题
在jsp和servlet的开发中,今天自己做的一个小例子中出现了中文乱码问题,用了许多方法,发现还是解决不了.最后我用了过滤器,才算终结. 此方法总结如下:在jsp页面中使用 ,这里的pageEnco ...
- JSP利用servlet上传文件时的中文乱码问题
JSP处理乱码问题是一个痛苦的过程.这次servlet传送文件的乱码折腾了我至少两周. 总结如下: 1.第一类乱码: 就是文件传送过来的文件名等是乱码:但是servlet输出的页面汉字正常显示. 解决 ...
- SpringMVC开发过程中的中文乱码问题
相信大家在开发初期遇到中文乱码问题一定是一头雾水,不是数据库乱码了就是页面乱码了或者传值时乱码.其实解决乱码的途径很简单,就是统一编码与解码的类型,我把自己遇到的乱码问题整理出来,希望能够对大家有用. ...
- jsp与servlet之间页面跳转及参数传递实例
1.从一个jsp页面跳转到另一个jsp页面时的参数传递 (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plaincopy < ...
- 11. jsp与servlet之间页面跳转及参数传递实例
1.从一个jsp页面跳转到另一个jsp页面时的参数传递 (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plain copy < ...
- .jsp与servlet之间页面跳转及参数传递实例
1.从一个jsp页面跳转到另一个jsp页面时的参数传递 (1)使用request对象获取客户端提交的信息 login.jsp页面代码如下: [java] view plaincopy &l ...
最新文章
- TENSORFLOW PROCESS FINISHED WITH EXIT CODE -1073741819 (0XC0000005)
- 面向对象的5个基本设计原则
- windows下安装emscripten
- OpenCV使用inRange的阈值操作Thresholding Operations
- POJ - 1584 A Round Peg in a Ground Hole(综合几何)
- 力扣 ---- java
- 贺利坚老师汇编课程49笔记:call和ret
- Ajax中的get和post两种请求方式的异同
- [mysql终极优化]之主从复制与读写分离详细设置教程
- DB2数据库常用指令以及重要知识点学习
- MKV(Matroska)常见问题浅析
- 原型图工具功能比拼1
- google浏览器安装vuejs-devtools插件2022-4-25记录
- 降雪致国道315线部分道路通行受阻公路交警部门昼夜坚守
- 【Blender报错记录】Bone Heat Weighting: failed to find solution for one or more bones
- 微软服务器WIFI连不上吗,Win10系统为什么连不上WiFi?该如何解决?
- 计算机组成原理---实验报告
- CentOS联网(图解超详细)
- 计算机专业考研可以考哪些研究所,计算机专业考研可以考哪些专业
- python查看显存占用情况以及使用numba.cuda释放显存
热门文章
- [原]OpenCV2.2无法打开摄像头或读取视频的解决方法
- 登陆窗体显示动态效果
- 配置SQL Server 2005 Express的身份验证方式,以及如何启用sa登录名。
- Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据
- 数据结构1:单链表反转java代码解释
- python微信好友分析源代码_搞事情了 | 教你用Python分析微信好友信息(内附完整代码)...
- python零基础入门大数据_【资源分享】零基础入门大数据(数据分析)经验分享...
- mysql 同步 存储过程_mysql 存储过程 实现数据同步
- android浮动文本,android – 如何将文本添加到浮动操作按钮?
- python链表的创建_《大话数据结构》配套源码:链表(Python版)