Android访问服务器(TOMCAT)乱码引发的问题

本文详细介绍了在Web应用中遇到的中文乱码问题及其解决方案。针对GET和POST请求的不同处理方式,提供了具体的配置方法,确保客户端和服务端之间的中文数据能够正确传输。

1、浏览器往服务器发送的请求主要可分为2种:get、post;delete、head等不赘述。

GET方式:

从浏览器上直接敲地址,最大特点就是参数直接跟在地址后面。

POST方式:表单提交等。

2、访问过程:

浏览器中输入地址 –> 浏览器对中文进行编码 –>发送到服务器 ->服务器进行解码

如何浏览器编码和服务器解码用的字符集不一致就会发生乱码问题。

3、乱码的解决

默认浏览器使用UTF-8编码(IE默认GBK当然可以通过meta标签设置)

服务器(Tomcat)默认使用iso-8859-1解码。Iso-8859-1是不支持中文的,也就是说不做处理,中文是一定乱码的。

POST方式解决:

比如表单提交,在Servlet或者Filter中设置request.setCharacterEncoding("UTF-8");就能很好的解决。

GET方式:单纯设置request.setCharacterEncoding("UTF-8");是没有用的,所以我们把默认的iso-8859-1编码改成UTF-8,在TOMCAT的配置文件的server.xml中更改:

<Connector port="8080"protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"URIEncoding="UTF-8" />

添加URIEncoding=UTF-8

4、Android中访问:

POST方式,通过HttpUrlConnection封装POST请求【具体实现百度】,POST方式参数是需要打包发送的,不是直接跟在url后面。例如:http://www.demo.com?p=123这不是post传输参数。

GET方式,通过HttpUrlConnection可以很简单的实现,但是会发现,很容易出现乱码问题。

首先:添加URIEncoding=UTF-8工作完成,还是会发送乱码。

这是因为,上面的访问过程提到浏览器对中文进行编码,这里我们直接发送请求,并没有编码这个过程,所以我们需要自己手动编码,即:

String name =URLEncoder.encode("中国万岁","UTF-8");

这样我们就模拟了浏览器的编码,然后发送至服务器,服务器解码也改成UTF-8了,于是又可以快乐的玩耍了。

<think> 嗯,用户这次提出了关于服务器中文乱码解决方案的问题,需要结合之前的引用内容和用户当前需求来思考。用户引用的资料提到Android客户端通过okhttp传json时出现中文乱码,以及SpringMVC框架下使用FastJson默认采用ISO-8859-1编码导致的乱码问题。 用户现在明确说"我想查找解决服务器中文乱码问题的方法",说明ta可能遇到了类似场景。不过要注意引用中提到的是客户端解决方案(new String重新编码),而用户现在需要的是服务器端方案——这可能暗示用户的环境是BS架构或客户端无法修改的情况。 考虑到中文乱码问题涉及多层因素,需要构建完整的排查框架: 1. 字符编码一致性检查(UTF-8贯穿全链路) 2. 容器配置(Tomcat的server.xml配置URIEncoding) 3. 框架配置(SpringMVC的消息转换器) 4. 数据库配置(连接参数&表字段编码) 5. 特殊情况处理(GET/POST差异) 特别要注意引用中提到的FastJson陷阱,这是常见踩坑点。SpringBoot环境下用@Bean配置HttpMessageConverters会更优雅。对于GET请求的URL传参乱码,单独强调Tomcat配置是因为其默认ISO-8859-1的行为很顽固。 用户没有说明具体技术栈,所以需要给出通用方案。值得补充的是,如果用户用Nginx做反向代理,还要检查proxy_set_header配置。不过当前回复已经覆盖主要场景,相关问题的设计可以引导用户细化需求。 </think> 服务器中文乱码通常由编码不一致引起,以下是系统级解决方案(按实现难度排序): ### 一、Servlet容器层配置(通用方案) ```xml <!-- Tomcat的server.xml --> <Connector port="8080" URIEncoding="UTF-8" useBodyEncodingForURI="true" /> ``` > 适用于GET请求参数乱码,强制容器使用UTF-8解码[^1] ### 二、过滤器层拦截(Spring推荐方案) ```java // Web.xml配置 <filter> <filter-name>encodingFilter</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> ``` > 强制所有请求/响应使用UTF-8编码,需配合`<url-pattern>/*</url-pattern>`[^1] ### 三、Spring MVC消息转换器(JSON专项方案) ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converter.setDefaultCharset(StandardCharsets.UTF_8); // 关键设置 converters.add(converter); } } ``` > 解决FastJson默认ISO-8859-1编码问题[^1] ### 四、数据库连接层(持久化解决方案) ```properties # JDBC连接串追加参数 jdbc:mysql://host/db?useUnicode=true&characterEncoding=UTF-8 ``` ### 五、极端情况手动转码(备用方案) ```java // 在Controller中使用 @PostMapping("/endpoint") public Response handle(@RequestParam String data) { String decoded = new String(data.getBytes("ISO-8859-1"), "UTF-8"); // 仅作临时救急,优先用前三种方案 } ``` ### 排查流程图 ```mermaid graph TD A[出现乱码] --> B{请求类型} B -->|GET| C[检查Tomcat URIEncoding] B -->|POST| D[检查CharacterEncodingFilter] D --> E{响应类型} E -->|JSON| F[配置MessageConverter] E -->|HTML| G[检查JSP pageEncoding] G --> H[数据库连接编码] ``` **最佳实践**:组合方案一 + 方案二可解决95%乱码问题,Spring Boot项目推荐通过`application.yml`配置: ```yaml server: tomcat: uri-encoding: UTF-8 spring: http: encoding: force: true charset: UTF-8 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值