Get请求,Post请求乱码问题解决方案
下面以两种常见的请求方式为例讲解乱码问题的解决方法。
1.Post方式请求乱码。
自从Tomcat5.x以来,Get方式和Post方式提交的请求,tomcat会采用不同的方式来处理编码。
对于Post请求,Tomcat会使用request.setCharacterEncoding和response.setCharacterEncoding方法设置的编码格式进行处理。
如果未设置,则默认都采用iso-8859-1编码。因此如果在发送Post请求的时候出现乱码,常见的解决方法如下:
a) request.setCharacterEncoding("utf-8");
b) String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
(当然response的编码也不要忘记设置成utf-8的)
【注】:上面提供的是两种不同的方法,并不是一种方法的两个步骤!!!
我们可以看出来第一种方式写法固定,非常很适合通过写成过滤器的方式进行编码的统一转换。
- publicclass EncodingFilter extends HttpFilter {
- publicvoid doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
- Stringcharset = this.getInitParameter("charset");
- if(charset == null ||charset.isEmpty()) {
- charset ="UTF-8";
- }
- request.setCharacterEncoding(charset);
- response.setContentType("text/html;charset=" + charset);
- chain.doFilter(request, response);
- }
- }
2.Get方式请求乱码
我们刚谈到Tomcat对Post请求的编码处理策略,并且从字里行间读出了Tomcat对Post和Get的编码策略有所不同,
那么Tomcat对Get请求的编码策略到底是如何不同的呢?答案就是Tomcat对于Get请求并不会考虑使用request.setCharacterEncoding方法设置的编码
言外之意就是我们无法通过request.setCharacterEncoding方式来改变编码,因为最终Tomcat会永远使用iso-8859-1进行编码(但是要注意一下,
respon还是可以通过调用response.setCharacterEncoding方式进行编码的设置的),既然是这样的话下面这个方法还是勉强可行的
a)
步骤一:response.setCharacterEncoding("UTF-8")
步骤二:String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
通过这两步,可以看到我们的request的字符编码格式是默认的“iso-8859-1" 我们的response字符编码是自己设置的”utf-8"
显然两个是不相容的,因此我们在获取请求参数的时候才进行了一下字符集的转换即步骤二:
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
既然有a),那肯定还有b)咯?当然!而且方案b更加干净,利落,彻底。让我们一起看一下吧:
b)
修改Tomcat安装目录下conf子目录下的server.xml文件(解决get方式) 【注:记得先停掉服务器】
找到文件中类似这样的段落:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
在里面加上这样一段:URIEncoding="UTF-8" 即变成下面这段
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
最后重启Tomcat即可。
对于Get请求编码的统一处理也可以写成过滤器的形式,只不过稍微有些复杂。
EncodingRequest.java
- public class EncodingRequest extends HttpServletRequestWrapper {
- private String charset;
- public EncodingRequest(HttpServletRequest request, String charset) {
- super(request);
- this.charset = charset;
- }
- public String getParameter(String name) {
- HttpServletRequest request = (HttpServletRequest) getRequest();
- String method = request.getMethod();
- if(method.equalsIgnoreCase("post")) {
- try {
- request.setCharacterEncoding(charset);
- } catch (UnsupportedEncodingException e) {}
- } else if(method.equalsIgnoreCase("get")) {
- String value = request.getParameter(name);
- try {
- value = new String(name.getBytes("ISO-8859-1"), charset);
- } catch (UnsupportedEncodingException e) {
- }
- return value;
- }
- return request.getParameter(name);
- }
- }
EncodingFilter.java
- public class EncodingFilter extends HttpFilter {
- public void doFilter(HttpServletRequest request,
- HttpServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- String charset = this.getInitParameter("charset");
- if(charset == null || charset.isEmpty()) {
- charset = "UTF-8";
- }
- response.setCharacterEncoding(charset);
- response.setContentType("text/html;charset=" + charset);
- EncodingRequest res = new EncodingRequest(request, charset);
- chain.doFilter(res, response);
- }
- }
web.xml
- <filter>
- <filter-name>EncodingFilter</filter-name>
- <filter-class>cn.itcast.filter.EncodingFilter</filter-class>
- <init-param>
- <param-name>charset</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>EncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
【注】为了避免您的测试与我给的解决方案结果不符,请在项目编码格式为utf-8,jsp页面 pageEncoding="utf-8"的环境下测试。
Get请求,Post请求乱码问题解决方案的更多相关文章
- java web项目get,post请求参数中文乱码解决
[转载]原文地址:https://www.cnblogs.com/tom-plus/p/6392279.html 在开发过程中,有时候会碰到get,post请求参数中文乱码. 原因: Http请求传输 ...
- SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...
- [转]解决GET请求时中文乱码的问题
原文地址:http://www.cnblogs.com/liukemng/p/4178882.html 之前项目中的web.xml中的编码设置: <filter> <filter-n ...
- Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表
本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...
- JSP中解决获取请求参数中文乱码问题
分两种情况: 1.获取访问请求参数时乱码 解决方法:构造一个新的String String user = new String(request.getParameter("user" ...
- 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)
前述: 在写这篇笔记之前,对笔记中的设计模式进行介绍: 本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式 (1)装饰(包装)设计模式口诀: ...
- 详解get请求和post请求参数中文乱码的解决办法
首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...
- post和get请求的参数乱码
对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考 ...
- tomcat解决GET请求中文参数乱码
通常,在使用Spring MVC框架的应用程序中,为了解决中文参数乱码的问题,都会添加如下过滤器配置: <filter> <filter-name>encodingFilter ...
随机推荐
- python3 练习题 day01
#练习题:'''1.简述变量命名规范'''#变量名由数字.字母.下划线组成#变量名可以字母和下划线开头,不能以数字开头,并且不能全为数字#变量名不能太长,且要有意义#最好使用驼峰或下划线格式命令#变量 ...
- Linux下 XordDos(BillGates)木马查杀记录
最近朋友的一台服务器突然网络异常,cpu占用率暴表,登录上去一查,cpu占用300% 左右,流量异常,经过看查进程,获取信息最终确认为中了dos木马,经过几天的研究,基本上已经清除,以下是清理记录. ...
- MATLAB——读取xls文件内容
[NUM,TXT,RAW]=xlsread('example',2,'B2:B261') NUM返回的是excel中的数据, TXT输出的是文本内容, RAW输出的是未处理数据 example:是需要 ...
- Python-2.7 : 编码问题及encode与decode
普通的字符串在py2.7中都是以ASCII编码的,例如str=“abc”,若含有中文则会以gbk或者gb2312编码(GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码;GBK 是 GB ...
- ASP.NET quartz 定时任务
1.下载 2.使用例子 Demo 概述:Quartz 是开源的定时任务工具类,默认每隔10秒执行一次任务,相当于C#的Timer,不断的循环执行(Start 方法),也可以随时停止(ShutDown方 ...
- DNS主从复制及区域传送
前言 DNS主从复制,就是将主DNS服务器的解析库复制传送至从DNS服务器,进而从服务器就可以进行正向.反向解析了.从服务器向主服务器查询更新数据,保证数据一致性,此为区域传送.也可以说,DNS区域传 ...
- Java原子类AtomicInteger实现原理的一点总结
java原子类不多,包路径位于:java.util.concurrent.atomic,大致有如下的类: java.util.concurrent.atomic.AtomicBoolean java. ...
- 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)
昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...
- Ajax获取 Json文件提取数据
摘自 Ajax获取 Json文件提取数据 1. json文件内容(item.json) [ { "name":"张国立", "sex":&q ...
- Ionic下的JPush缺少统计代码问题解决方法
用Ionic打包apk后安装到手机,收到缺少统计代码的提示,解决方法如下: 1. 找到了 platforms/android/src/com/ionichina/ioniclub/MainActiov ...