【JavaWeb】Servlet(getpost传参,响应页面)各种乱码以及控制台中文乱码问题原因和解决方案汇总

【JavaWeb】Servlet(getpost传参,响应页面)各种乱码以及控制台中文乱码问题原因和解决方案汇总,第1张

【JavaWeb】Servlet(get/post传参,响应页面)各种乱码以及控制台中文乱码问题原因和解决方案汇总

目录

1、解决乱码的思路:都是统一字符编码和字符解码的字符集,建议都用UTF-8

2、准备知识

3、http响应html页面乱码:tomcat发给浏览器

3.1 设置发送端(servlet)对html页面编码的字符集

3.2 设置接收端(浏览器)对html页面解码的字符集

4、http响应数据乱码:servlet发送给浏览器等客户端

4.1 设置发送端(servlet)对数据编码的字符集

4.2 设置接收端(浏览器等)对数据解码的字符集

5、http get请求参数乱码:浏览器发送给后端servlet

5.1 设置发送端(浏览器)url编码的字符集

5.2 设置接收端(servlet)url解码的字符集

5.2.1 方案1【推荐】:设置tomcat解码的字符集为UTF-8

5.2.2 方案2【不推荐】:通过new String()方式转码

5.2.3 方案3【推荐】:使用过滤器方法给所有servlet参数转码

5.2.4 方案4:用post

6 http post请求参数乱码:浏览器发送给后端servlet

6.1 设置发送端(浏览器)的对请求体(post参数放入请求体)编码的字符集

6.2 设置接收端(servlet)解码的字符集

6.2.1 方案1【不推荐】:通过req.setCharacterEncoding("UTF-8")方式转码

6.2.2 方案2【推荐】:使用过滤器方法给所有servlet参数转码

7、http响应jsp页面乱码:tomcat发给浏览器

7.1 设置发送端(servlet)对jsp页面编码的字符集

7.1.1 方式一【不推荐】:以idea为例,右下角可以修改jsp等文件编码

7.1.2 方式二【推荐】:在文件头设置 pageEncoding,idea的jsp文件编码以此为准(右下角编码变灰色,不可改)

7.1.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)

7.2 设置接收端端(浏览器等)对jsp页面解码的字符集

7.2.1 方式一【不推荐】:

7.2.2 方式二【推荐】:在文件头设置 pageEncoding

7.2.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)

8、tomcat日志在idea种乱码

参考:

【JavaWeb开发】Servlet彻底解决开发中请求(get/post)、应答以及控制台中文乱码问题


1、解决乱码的思路:都是统一字符编码和字符解码的字符集,建议都用UTF-8

2、准备知识

2.1 HTML URL 编码参考手册 | 菜鸟教程

 2.2 javaweb servlet

Servlet 教程 | 菜鸟教程

3、http响应html页面乱码:tomcat发给浏览器

测试代码




    
    
    
    
    
    Title




3.1 设置发送端(servlet)对html页面编码的字符集

以idea为例,右下角可以修改html等文件编码

 

 

3.2 设置接收端(浏览器)对html页面解码的字符集
1、浏览器解码时优先读取响应头的Content-Type中的字符集,没有则读取标签中的字符集。
   不同浏览器默认(自动)解码的字符集不固定(以系统编码为准居多),可以右键设置当前页面解码和编码的编码字符集
2、对于html文件,无法设置响应头的Content-Type中的字符集,只需在标签中添加

 

 补充:IE和360浏览器可以右键修改编码字符集,修改后解码和 编码都以修改后的为准,但是只对本浏览窗口有效

4、http响应数据乱码:servlet发送给浏览器等客户端

 测试url:http://localhost:8080/lishuoboy_javaweb_war_exploded/A01Servlet

servlet 测试 代码:

@WebServlet(name = "A01Servlet", value = "/A01Servlet")
public class A01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.getWriter().println("name=硕");
    }
}

乱码图例:

4.1 设置发送端(servlet)对数据编码的字符集

以下3个都可以,如果都设置了,那么后面的覆盖前面的,其中resp.setCharacterEncoding("UTF-8");只能覆盖content-type的charset的值

【不推荐】resp.setCharacterEncoding("UTF-8");

推荐使用下面两个,因为下面两个设置了字符编码还在响应头设置了content-type,就是告诉浏览器解码字符集

【推荐】resp.setContentType("text/json;charset=utf-8");                     // 前面的 text/json;可根据具体情况选择,一般json居多

【推荐】resp.setHeader("content-type", "text/json;charset=UTF-8");  // 前面的 text/json;可根据具体情况选择,一般json居多

4.2 设置接收端(浏览器等)对数据解码的字符集

以下2个都可以,如果都设置了,那么后面的覆盖前面的。下面两个设置会在响应头设置了content-type,就是告诉浏览器解码字符集

resp.setContentType("text/json;charset=utf-8");                     // 前面的 text/json;可根据具体情况选择,一般json居多

resp.setHeader("content-type", "text/json;charset=UTF-8");  // 前面的 text/json;可根据具体情况选择,一般json居多

 

 设置后,setContentType之后,http响应头会有对应参数content-type,浏览器就知道响应数据的字符集了

 

 补充:IE和360浏览器可以右键修改编码字符集,修改后解码和 编码都以修改后的为准,但是只对本浏览窗口有效

5、http get请求参数乱码:浏览器发送给后端servlet

get提交不经过请求体而是通过URL传参

测试url:

url编码前 http://localhost:8080/lishuoboy_javaweb_war_exploded/A01Servlet?name=硕

url编码后 http://localhost:8080/lishuoboy_javaweb_war_exploded/A01Servlet?name=%E7%A1%95

可以看到URL编码后“硕”变成了“%E7%A1%95”,有三个%,说明是用UTF8字符集编码的,因为UTF8字符集一个汉字占用3个字节。GBK一个汉字占用2个字节

servlet 测试 代码:

@WebServlet(name = "A01Servlet", value = "/A01Servlet")
public class A01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        String name = req.getParameter("name");
        System.out.println("name=" + name);
    }
}

乱码图例:

5.1 设置发送端(浏览器)url编码的字符集

如果是纯url,现在主流新版浏览器都是(谷歌、IE、火狐)用UTF-8字符集对URL的非ASCⅡ字符进行编码,无需设置。

如果是html或jsp等文件,url编码与当前文件解码的字符集一致。如第3.2节所说:浏览器解码优先读取响应头的Content-Type中的字符集,没有则读取标签中的字符集。

IE默认url编码(get请求)

如果是html页面form表单,发送的url则与当前页面的解码编码一致

5.2 设置接收端(servlet)url解码的字符集 5.2.1 方案1【推荐】:设置tomcat解码的字符集为UTF-8

tomcat8.0之后默认的解码的字符集就是UTF-8,无需设置

tomcat8.0之前默认的解码的字符集是ISO-8859-1,需要设置,设置方法:修改tomcat目录下/conf/server.xml文件,设置 URIEncoding="UTF-8"。

    
5.2.2 方案2【不推荐】:通过new String()方式转码

假如tomcat URI解码的字符集是“ISO-8859-1“,即配置为URIEncoding="UTF-8",用getBytes(“ISO-8859-1“)拿到原编码的byte数组,再通过new一个String转成UTF-8编码

优缺点:每个servlet、每个参数都需要转码(可以给所有参数写个for循环转码)

5.2.3 方案3【推荐】:使用过滤器方法给所有servlet参数转码

原理跟方案2一样,只不过不用每一个参数都写一次转码

具体写法:过滤器(解决中文乱码get/post)_mtm001的专栏-CSDN博客_乱码过滤器

优缺点:每个参数都需要转码(可以给多个参数写个for循环),但不用每个servlet都转

5.2.4 方案4:用post

提供一个思路,get提交几乎每一点都比不上post提交,那么就使用post提交方式就好了。

6 http post请求参数乱码:浏览器发送给后端servlet

post提交经过请求体而不是通过URL传参

测试html页面表单:

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>


    Title
    
    
    
    
    





servlet 测试代码:

@WebServlet(name = "A01Servlet", value = "/A01Servlet")
public class A01Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {
        String name = req.getParameter("name");
        System.out.println("name=" + name);
    }
}

乱码情况:

6.1 设置发送端(浏览器)的对请求体(post参数放入请求体)编码的字符集

不同浏览器默认解码的字符集不固定(以自动识别或以系统编码为准居多),手工设置需在标签中添加

html或jsp等文件,发送中的字符编码与当前文件解码的字符集一致。如第3.2节所说:浏览器解码优先读取响应头的Content-Type中的字符集,没有则读取标签中的字符集。

 补充:IE和360浏览器可以右键修改编码字符集,修改后解码和 编码都以修改后的为准,但是只对本浏览窗口有效

h1

6.2 设置接收端(servlet)解码的字符集 6.2.1 方案1【不推荐】:通过req.setCharacterEncoding("UTF-8")方式转码

注意点:req设置编码前不能get过参数,否则就不好使了

优缺点:每个servlet都需要转码

6.2.2 方案2【推荐】:使用过滤器方法给所有servlet参数转码

原理跟方案1一样,只不过不用每一个servlet都做一次转码

注意点:req设置编码前不能get过参数,否则就不好使了

优缺点:不用每个servlet都转码

7、http响应jsp页面乱码:tomcat发给浏览器 7.1 设置发送端(servlet)对jsp页面编码的字符集

html或jsp等文件,发送中的字符编码与当前文件解码的字符集一致。如第3.2节所说:浏览器解码优先读取响应头的Content-Type中的字符集,没有则读取标签中的字符集。

7.1.1 方式一【不推荐】:以idea为例,右下角可以修改jsp等文件编码

7.1.2 方式二【推荐】:在文件头设置 pageEncoding,idea的jsp文件编码以此为准(右下角编码变灰色,不可改)

 看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器

7.1.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)

 看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器编码字符集

7.2 设置接收端端(浏览器等)对jsp页面解码的字符集 7.2.1 方式一【不推荐】:

7.2.2 方式二【推荐】:在文件头设置 pageEncoding

idea的jsp文件编码以此为准(右下角编码变灰色,不可改)

 看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器

7.2.3 方式三【推荐】:在文件头设置 contentType="text/html;charset=UTF-8",该设置会覆盖“方式二”的设置(看下面的源码)

 看一下jsp翻译的java原文件,该设置不仅设置了文件编码,还设置响应头的contentType,告诉浏览器编码字符集

8、tomcat日志在idea种乱码

修改tomcat目录下conf/logging.properties文件,ConsoleHandler.encoding=UTF-8

参考: 【JavaWeb开发】Servlet彻底解决开发中请求(get/post)、应答以及控制台中文乱码问题

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存