• JavaWeb中编码问题的解决办法(在客户端和服务器之间传入或响应数据后中文乱码; cookie的乱码问题) || Cookie和Session


    在JavaWeb中,解决中文编码这个问题总结下来一共有有两处

    1.在Get或者Post请求中, 携带有中文的时候可能会造成乱码问题

    在Tomcat中,对于POST和GET请求,都默认才有的ISO-8859-1的编码方式.而该ISO-8859-1不支持中文,所以乱码.
    --------------------------------------------------------------------
    解决方案:
      1:按照ISO-8859-1把乱码恢复成二进制形式
      byte[] data=username.getBytes("ISO-8859-1");
      2:再把二进制形式的数据使用UTF-8重新编码
      String username = new String(data,"UTF-8");
    --------------------------------------------------------------------
    但是同样上述代码也有一个问题, 获取一个参数的时候需要使用两行代码来转码,如果现在需要获取N个参数,那么就需要转N次,出现了代码重复的严重问题.
    解决方案:
      针对于POST请求方式:
      request.setCharacterEncoding("UTF-8");
      注意:1:只对POST有效,2:必须放在获取任意参数之前.
      针对于GET请求方式:   修改Tocmcat中的server.xml配置文件中修改端口的元素,对GET方式的默认编码.在开发中, 我们很少会用到并且不建议去修改Tomcat服务器的server.xml配置文件, 因为我们很少会用Get方式传递中文

    2.对Cookie的操作的时候,我们常常也会遇到中文乱码的问题

    下面是对Cookie常用操作的复习与回顾, 按照这个思路来说明下中文乱码的问题

    我们常见的Cookie的操作:
    1:创建Cookie对象.
         Cookie cookie = new Cookie(String name,String value);
           参数:
              name:  该当前Cookie取一个唯一的名字.
              value: 存储在Cookie的共享数据,只能是String类型.
         Cookie cookie = new Cookie("currentName","will");
    2:把Cookie放入响应中,响应给浏览器,把共享的数据存储在浏览器中.
         response.addCookie(cookie);
    3:获取Cookie以及获取Cookie中的数据.
      因为Cookie是客户端技术,并且每一次请求都会携带,因此是存放在请求头中,所以应该通过request去获取.
      Cookie[] cs = req.getCookies();
      获取当前Cookie的名字: String name = cookie对象.getName();
      获取当前Cookie的值:   String value= cookie对象.getValue();
    4:Cookie的中文问题.
      在Cookie中属性名和属性值都不能使用中文.

     5:修改Cookie中指定属性名的属性值.
       需求:修改Cookie cookie = new Cookie("currentName","will");
        方式1:创建一个同名的新的Cookie.
         Cookie c = new Cookie("currentName","Lucy");
        方式2:获取该Cookie对象,通过setValue方法,重新设置新的value值.
         Cookie对象.setValue("新的值");
       注意:别忘了,重新把该Cookie放入响应中:resp.addCookie(c);
      6:Cookie的分类(会话Cookie和持久化Cookie):
        会话Cookie: 关闭浏览器之后,Cookie就销毁了. 缺省情况.
        持久化Cookie: Cookie可以保存指定的时间段(3天,一周,一个月).
        设置Cookie的最大存活时间: cookie对象.setMaxAge(int seconds);
             seconds == 0: 删除Cookie.
             seconds < 0: 会话Cookie.
             seconds > 0: 存储指定的秒数
      7:删除Cookie: cookie对象.setMaxAge(0);

    
    

     附:对session的复习

    上面提到Cookie的使用, 可以得知Cookie的问题和需要改进的地方

    Cookie的缺陷:
        1):多个人使用同一台电脑的时候,可以查看浏览器的Cookie,不安全.
        2):Cookie存储中文比较麻烦(得编码,再解码).
        3):Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据,就得死还有N个Cookie.
        4):一个站点对Cookie有限制:
          Cookie大小限制在4KB之内;
          一台服务器在一个客户端最多保存20个Cookie;
          一个浏览器最多可以保存300个Cookie;
        5):在设计上就有问题,考虑生活中问题.
           Cookie是浏览器和服务器之间数据交互的凭证.
           在生活中,我们是把识别数据存储到服务端.
    -------------------------->Session.

    因此, 引出了session的技术, 值得注意的是: 

    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,
    由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,
    其它web资源再从用户各自的session中取出数据为用户服务

    注意: Session其本质就是一个会话Cookie(浏览器关闭之后,Session就失效了).

    对比下两种技术的原理图, 就可以看出他们其中的差异

     该图为Cookie的原理图 

    ==============================================================================================================================

     该图为Session的原理图

    Session的操作:
    1:创建和获取Session对象.
      HttpSession session = request.getSession(true);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就先创建一个再返回.
      HttpSession session = request.getSession(false);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就返回null.
      HttpSession session = request.getSession();等价于HttpSession session = request.getSession(true);
    
    2:往Session中存储数据.
      session对象.setAttribute(String name,Object value);
    
    3:从Session中取出数据.
      Object value = session对象.getAttribute(String key);
    
    4:删除Session(用户注销登陆).
         1):删除Session中指定属性名的值.
            session对象.removeAttrbute("currentName");
         2):销毁Session对象(Session中所有的属性都不存在).
            session对象.invalidate();
    5.Session的超时管理
      在超时时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),则自动的销毁Session.
      session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session.
      Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了.
    6.URL重写.
       Session是一种特殊的Cookie,而浏览器可以禁用Cookie.
       此时,需要在每一个资源之后,手动的携带session的ID: /session/list;jsessionid=872870F9466CE7B3A11FD3B768FDD684
       但是我们手动来拼接session的ID的话,一个可以,要是每一个资源都需要拼接这一段的话, 属实是是一个没有技术含量的活,因此在 response 里面有一个方法用于拼接jsessionid的。
       String url = response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=872870F9466CE7B3A11FD3B768FDD684
       注意:开发中都不会取消接受Cookie的.
    Session的细节:
       1:一般的,我们存储到Session中的属性名称,要唯一,我们习惯XXX_IN_SESSION:
         session对象.setAttribute("USER_IN_SESSION","will");
       2:若需要把多个数据存放到Session中,就得调用setAttribute方法N次,可以的.
         一般的,我们把需要存储的数据,封装成一个对象,然后在存储到Session中.
         把用户的信息,封装到user对象.
         session对象.setAttribute("USER_IN_SESSION",user对象);
       3:如果多台服务器之间需要共享Session,此时Session中的对象,必须实现java.io.Serializable(才能在网络上传输).
          序 列 化: 把对象信息存储为二进制.
          反序列化: 把二进制信息恢复成对象.
       public class User implements java.io.Serializable{....}
    
    
    注: 如果浏览器禁用Cookie的话, 那么Session也用不了了
  • 相关阅读:
    Swagger介绍
    mybatis-plus常用操作
    [比赛][蓝桥杯] 第十一届蓝桥杯第二次省赛C++A组
    [题目][蓝桥杯PREV-14] 高僧斗法
    [题目][蓝桥杯PREV] 大合集
    [题目][APIO2009][蓝桥杯ALGO-44] 采油区域
    [题目][蓝桥杯ALGO] 大合集
    [题目][NOIP2001][蓝桥杯ALGO-25] Car 的旅行路线
    [题目][蓝桥杯ALGO-22] 数的划分
    [知识点] 1.5.3 运算符重载
  • 原文地址:https://www.cnblogs.com/djma/p/15176583.html
Copyright © 2020-2023  润新知