zoukankan      html  css  js  c++  java
  • 请求乱码、响应乱码的解决方案

    请求乱码

    客户端发送请求常用方式是GET、POST

    GET请求

    1. 使用代码转换的方式
    2. 修改tomcat配置文件server.xml的方式

    代码转换

    url

    http://localhost:8080/HelloServlet/h5?username=王学武

    servlet类

     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         String username = req.getParameter("username");
     6         //get请求过来的数据,在url地址栏上就已经经过编码了,所以我们取到的就是乱码
     7         System.out.println("username===" + username);
     8         
     9         //tomcat收到了这批数据,getParameter 默认使用ISO-8859-1去解码
    10         //先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串
    11         username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
    12         System.out.println("username===" + username);
    13     }
    14 
    15 }

    console输出

    username===王学武
    username===王学武 

    修改tomcat配置文件

    直接在tomcat里面做配置,在tomcat里面做设置处理 conf/server.xml 加上URIEncoding="utf-8",以后get请求过来的数据永远都是用UTF-8编码

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>

    servlet类

    1 public class HelloServlet5 extends HttpServlet {
    2     @Override
    3     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4         String username = req.getParameter("username");
    5         System.out.println("username===" + username);
    6     }
    7 }

    console输出

    username===王学武

    POST请求

    设置请求体里面的文字编码

    request.setCharacterEncoding("UTF-8");

    servlet类

     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         req.setCharacterEncoding("utf-8");
     6         String name = req.getParameter("username");
     7         System.out.println("设置请求体编码后:name==="+name);
     8     }
     9     
    10 }

    console输出

    设置请求体编码后:name===王五
    

    如果在获取参数后设置req.setCharacterEncoding("utf-8");就不会起作用

     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         String name = req.getParameter("username");
     6         System.out.println("设置请求体编码前:name==="+name);
     7         System.out.println("-------------------------");
     8         
     9         req.setCharacterEncoding("utf-8");
    10         name = req.getParameter("username");
    11         System.out.println("设置请求体编码后:name==="+name);
    12     }
    13     
    14 }

    console输出

    设置请求体编码前:name===王五
    -------------------------
    设置请求体编码后:name===王äº 

    对GET方式不起作用

     url

    http://localhost:8080/HelloServlet/h5?name=王学武

    servlet类

     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         req.setCharacterEncoding("utf-8");
     6         String name = req.getParameter("name");
     7         System.out.println("name==="+name);
     8     }
     9     
    10 }

    console输出

    name===王学武 

    响应乱码

    响应输出有两种方式

    1. 字符流
    2. 字节流
     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         //以字符流的方式写数据
     6 //        resp.getWriter().write("<h3>response...</h3><br/>");
     7 //        resp.getWriter().write("<h3>response...</h3>");
     8 //        resp.getWriter().flush();
     9         //以字节流的方式写数据
    10         resp.getOutputStream().write("response...".getBytes());
    11     }
    12     
    13 }

    注:getWriter(),outPutStream在进行文件写入操作只能用一个,否则会抛出java.lang.IllegalStateException: getWriter() has already been called for this response

     字符流输出乱码

     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         //以字符流的方式写数据
     6         PrintWriter out = resp.getWriter();
     7         //out.write("<h3>响应输出数据</h3><br/>");
     8         
     9         //1. 指定输出到客户端的时候,这些文字使用UTF-8编码
    10         resp.setCharacterEncoding("UTF-8");
    11         //2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
    12         resp.setHeader("Content-Type", "text/html; charset=UTF-8");
    13         
    14         out.write("<h3>响应输出数据</h3>");
    15     }
    16     
    17 }

    原因:必须在resp.getWriter()之前设置字符编码操作

     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         
     6         //1. 指定输出到客户端的时候,这些文字使用UTF-8编码
     7         resp.setCharacterEncoding("UTF-8");
     8         //2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
     9         resp.setHeader("Content-Type", "text/html; charset=UTF-8");
    10         
    11         //以字符流的方式写数据
    12         PrintWriter out = resp.getWriter();
    13         out.write("<h3>响应输出数据</h3>");
    14     }
    15     
    16 }

     修改servlet类的代码

     1 public class HelloServlet5 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         
     6         //1. 指定输出到客户端的时候,这些文字使用UTF-8编码
     7         resp.setCharacterEncoding("UTF-8");
     8         //2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
     9         resp.setHeader("Content-Type", "text/html; charset=UTF-8");
    10         
    11         //以字符流的方式写数据
    12         PrintWriter out = resp.getWriter();
    13         out.write("<h3>响应输出数据</h3>");
    14     }
    15     
    16 }

    字节流输出

     1 public class HelloServlet5 extends HttpServlet {
     2     @Override
     3     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     4         //1. 指定浏览器看这份数据使用的码表
     5         resp.setHeader("Content-Type", "text/html;charset=UTF-8");
     6         
     7         //2. 指定输出的中文用的码表
     8         resp.getOutputStream().write("响应输出数据".getBytes("UTF-8"));
     9     }
    10 }

    其实,无论是字节流输出还是字符流输出,通用写法:

    1. response.setContentType("text/html;charset=UTF-8")
    2. 写输出数据即可
  • 相关阅读:
    layui弹出层处理(获取、操作弹出层数据等)
    Unity3D判断鼠标向右或向左滑动,响应不同的事件
    (转载)李剑英的CSLight入门指南结合NGUI热更新
    Unity3D研究院之LZMA压缩文件与解压文件
    CSLight研究院之学习笔记结合NGUI(一)
    《暗黑世界GM管理后台系统》部署+功能说明文档
    Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码
    电信SDK Pay函数里面System.out.print 无输出消息
    WP8:在Unity中使用OpenXLive
    WP8:Unity3D之间的值传递
  • 原文地址:https://www.cnblogs.com/qf123/p/10057639.html
Copyright © 2011-2022 走看看