zoukankan      html  css  js  c++  java
  • get请求乱码情况

    编写一个RegistServlet处理用户的Get请求数据

     1     public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
     2         // 处理响应数据的格式和编码
     3         response.setCharacterEncoding("utf-8");
     4         response.setContentType("text/html;charset=utf-8");
     5         // 获取字符输出流对象
     6         PrintWriter out = response.getWriter();
     7         // 获取请求参数
     8         String name = request.getParameter("uname");
     9         String address = request.getParameter("address");
    10         // 输出数据
    11         out.println("name="+name);
    12         out.println("<br/>");
    13         out.println("address="+address);
    14     }
    View Code

    运行结果发现输入中文提交后显示结果为乱码:

    jsp页面中    <meta http-equiv="content-type" content="text/html; charset=UTF-8">通知浏览器以utf-8解码

    get请求编码方式和post请求提交编码方式不同,get是把数据直接放到url中,例如以上的uname,IE浏览器先对中文进行utf-8编码(一个中文3个字符表示 太长),继而为了缩短字符又用ISO8859-1编码后传递给服务器。服务器的doGet方法中要先进行ISO8859-1解码再utf-8解码才能看到中文。

    而post请求则在浏览器端把数据以utf-8的形式存储到http的请求体中,不用通过url传输,继而只要    request.setCharacterEncoding("utf-8");通知request以utf-8形式解码就行,因为request默认以ISO8859-1进行解码的。

    使用代码解决乱码问题

     1     public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
     2         // 处理响应数据的格式和编码,通知浏览器数据的显示方式
     3         response.setCharacterEncoding("utf-8");
     4         response.setContentType("text/html;charset=utf-8");
     5         // 获取字符输出流对象
     6         PrintWriter out = response.getWriter();
     7         // 获取请求参数
     8         String name = request.getParameter("uname");
     9         String address = request.getParameter("address");
    10         // 获取ISO8859-1的原始数据
    11         byte [] bs = name.getBytes("ISO8859-1");      //内部编码字节流,其实中文字符经过utf-8编码后的字节 都是英文可以表示的,只是                                           //ISO8859-1显示数据以一个字节一个字节显示,而utf-8以几个字节一起表示
    12         name = new String(bs,"UTF-8");
    13         bs = address.getBytes("ISO8859-1");
    14         address = new String(bs,"UTF-8");
    15         // 输出数据
    16         out.println("name="+name);
    17         out.println("<br/>");
    18         out.println("address="+address);
    19     }

    如果使用以上的代码解决GET乱码每一个请求参数都需要重新的解码太繁琐,因此可以直接使用服务器通知浏览器以指定的方式进行编码字符数据。

    使用URIEnoding方式解决GET乱码问题

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

    URIEncoding主要指定的是%E5%8D%A1%E5%8D%A1的数据的解码方式,如果没有指定那么默认是ISO8859-1,如果指定那么采用指定的码表进行解码。因此服务器端就没有必要使用两个中编码方式进行转码了。

    注意:在实际的生产环境中我们代码的乱码问题不可能以来服务器帮助我们解决,因此推荐使用第一个转码方式。后期可以直接实现一个乱码的过滤器实现处理乱码的问题。

    http://localhost:8080/day07/regist?uname=焦宁波 在地址栏中输入需要的中文数据【乱码】

    <a href="/day07/regist?uname=人人">单击我传递中文数据</a> 【乱码】

    以上两个代码出现乱码状况一致:地址栏中直接原样出现了中文。

    因此对于以上的参数在传递的过程中必须进行基本的中文编码处理。

    URLEncoder.encode(需要编码的字符, 需要编码码表)
    那么在服务器端使用GET乱码的解决方案即可。

    http://blog.sina.com.cn/s/blog_673c81990100t1lc.html

  • 相关阅读:
    verifycode验证码模版
    输出一个整数的每一位,如:123的每一位是1 , 2 , 3
    编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序
    获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
    一台客户端有三百个客户与三百个客户端有三百个客户对服务器施压,有什么区别?
    软件生存周期及其模型是什么?
    试述软件的概念和特点?软件复用的含义?构件包括哪些?
    Spring Cloud Stream与Spring Cloud Bus区别
    Spring的设计模式
    JavaScript的事件循环机制总结 eventLoop
  • 原文地址:https://www.cnblogs.com/friends-wf/p/3731058.html
Copyright © 2011-2022 走看看