我们在实际web开发当中经常会遇到中文乱码的问题, 最近遇到一个很奇怪的问题, 通过前台查询数据请求如:
http://localhost:8080/platform/orderList/getPaymentType/微信支付, 查询是通过微信支付方式的订单信息
返回的结果是null, 纳尼,难道数据库没有值吗 于是查数据库:
select * from orders where paymentType="微信支付"
这种方式是有返回值的,于是开始痛苦的troubleshooting
首先检查一下数据库的编码设置, 要确保数据库和表的编码类型是UTF-8
检查框架中的配置 保证编码类型一致 web.xml的配置如下:
<!--字符集过滤器--> <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>/*</url-pattern> </filter-mapping>
Controller传入参数为HttpServletRequest,HttpServletResponse类获取request,response并调用:
request.setCharacterEncoding("UTF-8") response.setCharacterEncoding("UTF-8")
纳尼以上还没解决问题,我已经考虑是不是数据库连接有问题,于是查看:
<!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="${initialSize}"/> <!-- 连接池最大数量 --> <property name="maxActive" value="${maxActive}"/> <!-- 连接池最大空闲 --> <property name="maxIdle" value="${maxIdle}"/> <!-- 连接池最小空闲 --> <property name="minIdle" value="${minIdle}"/> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="${maxWait}"/> </bean>
换了阿里的druid 但最终测试结果表明不是这个问题
于是继续看看是不是spring-ibatis.xml的配置需要设置:
<!--中文乱码问题解决--> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean>
加上这个应该问题就搞定了吧, 运行一看纳尼什么情况, 还是查不到数据, 那就再来看咯
看一下tomcat目录下的conf文件夹下的server.xml,修改如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
运行一下试试看看:
http://localhost:8080/platform/orderList/getPaymentType/微信支付
运行结果:
[{ }, orderId: "11771994345", deliveryMethod: "京东快递", paymentType: "微信支付", price: 139, address: "上海浦东新区", status: "0" { } orderId: "11771994350", deliveryMethod: "京东快递", paymentType: "微信支付", price: 234.23, address: "南京市鼓楼区吴江路22号", status: "0" ]
终于可以返回数据了, 真是苍天不负有心人哪