zoukankan      html  css  js  c++  java
  • 关于servlet中doGet和doPost乱码再一次理解

    今天系统的整理了在web项目下,出现的编码问题,下面就做一些总结:

    首先对HTTP协议中对GET和POST的定义:

     GETPOST
    后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
    书签 可收藏为书签 不可收藏为书签
    缓存 能被缓存 不能缓存
    编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
    历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
    对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
    对数据类型的限制 只允许 ASCII 字符。 没有限制。也允许二进制数据。
    安全性

    与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。

    在发送密码或其他敏感信息时绝不要使用 GET !

    POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
    可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。

    再次理解servlet中有的那几个方法:

    增、删、查、改

    get -> select

    post -> update

    put -> insert

    delete -> delete

    但是其实get和post就能完成我们的所有操作!

    其实有doGet、doPost、doPut和doDelete但是其中doPut和doDelete用的较少。而get方式直接加在url后面,post方式必须通过表单。

    我们常用的就是doGet和doPost,get方式其实在http协议中并不是一个传数据的角色,更多的是用来从服务器上获得数据的,严格意义上来讲最初不是用来从客户端到服务器这个传输数据的;只是form表单的get方式提交,对url传值的扩展通过?name=xxx&password=xxx诸如此类的方式。

    这里我们对get的url传值已经有了深刻的了解,也就更能理解为什么我们传大文本和文件图片等等的时候,都是使用post的方式了吧?url传值不能传递实体内容,因为url的长度在http协议中虽然没有明确的长度规定,但是在浏览器的规范中都是限制了长度的,1KB或2KB或多或少!

    补充存在于:url中的内容都要通过urlencode进行加密,成符合url格式的字符串:

    ‘ ‘ 空格 %20
    ‘!’ 感叹号 %21
    ‘&’ 花at %26
    ‘/’ 斜杠 %2F
    ‘:’ 冒号) %3A
    ‘=’ 等于号 %3D
    ‘?’ 问号 %3F

    get方式遇到的问题:

    问题的起因很简单,在网上看了一些博文说,在tomcat作为的web容器下,通过GET方式进行表单提交,传参到servlet中会出现乱码,但是我在本地进行测试的时候发现,并没有出现GET方式乱码的情况:

    因为我的IDE中配置的工作空间的编码格式是UTF8的,所以猜测我的tomcat可能是UTF8的。

    首先回忆我是不是对我的tomcat进行了配置,故到tomcat中的config中查看server.xml中查看是不是有配置:

    发现其中并没有多余的配置,测试了8.0和发现也没有出现乱码的情况,后面了解到tomcat从8.0开始默认的编码就是UTF8了,测试7.0的Tomcat发现,GET方式出现了乱码,通过:new String(xxx.getBytes(“ISO-8859-1“), “utf-8“);解码正常


    测试结果Tomcat从8.0开始转化为默认编码为utf-8的格式了,但是8.0以下的tomcat默认的编码还是ISO-8859-1;

    Tomcat8.0及以上默认编码为utf-8;

    Tomcat7.0及以下默认编码为ISO-8859-1;

    项目开发下,我们可以通过在tomcat的server.xml中的URIEncoding="UTF-8";

    这样设置tomcat的编码格式为utf-8来配合我们IDE中的utf-8,来保证在开发过程中不出现乱码问题;

    在实际的上线的时候

    1.如果可以修改web容器的编码为utf-8最好(urlEncoding="utf-8");

    2.不行的话我们可以选择:过滤器+动态代理的方式,用动态代理的方式来重写HttpServlet中的getParameter方法【逻辑:如果为GET方式的request请求,就做一个newString(xxx.getBytes(“ISO-8859-1”), “utf-8”)】来解决ISO-8859-1编码下的tomcat的get方式中文乱码的问题;【在过滤器中的操作】 -- 后面会专门讲

    3.当然最好的就是,不要使用get方式进行中文的传参!

     POST方式遇到的问题:

    使用POST进行获取参数的时候也要注意!

    必须在doPost方法的一开始就使用:request.setCharacterEncoding("utf-8");

        或者在过滤器中一开始就写上request.setCharacterEncoding("utf-8");来保证POST方式后面获取到的parameter正常

    这里有个问题要记录一下,如果不写这一句直接在doPost中getParameter,就会造成获取的中文参数异常:这句代码约束post中的内容编码为utf-8,必须写在doPost或者filter中第一个request.getParameter之前才行,如果没有设置utf-8,在调用第一个getParameter之后request中的所有键值对就都被解析成了ISO-8859-1的编码的字符了,再去设置characterEncoding为utf-8就已经无效了,就只能通过getParameter之后new String(xxx.getBytes("ISO-8859-1"),"utf-8")的方式来还原字符串了

    但是get方式是取决于Tomcat的默认的urlencoding的编码。

     

    关于URL中的中文的问题:

    在IE下的url中不能显示中文,但是在firefox和chrome中的url中可以显示中文,因为我都设置为了unicode,所以在unicode编码的浏览器环境下,原本encoder.encode(“utf-8”);的数据,都被浏览器替换解密了出来。

    在开发中,为了保证开发的稳定性,我们在能够设置utf-8的地方都设置utf-8;

    在运行环境复杂,为了保证系统的稳定下,尽量使用doPost传值,不使用get方式传值,或者url传值中不使用中文!

     

  • 相关阅读:
    VS2010中连接sdf数据库的字符串 Kevin
    找不到请求的 .Net Framework Data Provider。可能没有安装 Kevin
    MVC项目中找不到 DbContext 命名空间 Kevin
    Something About Assert()——C#中的断言 Kevin
    Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction Kevin
    .NET 中的双问号 Kevin
    苹果公司一道面试题 Kevin
    The diffrence between TempData and ViewBag and ViewData Kevin
    GRUB整体分析
    忠诚的成本看房产大鳄冯仑如何处理看待忠诚
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053453.html
Copyright © 2011-2022 走看看