前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >状态管理-Cookie

状态管理-Cookie

作者头像
qubianzhong
发布2018-08-10 16:43:22
5190
发布2018-08-10 16:43:22
举报
文章被收录于专栏:行者常至行者常至

状态管理

为什么需要状态管理?
  • Web应用程序使用HTTP协议通信,而HTTP协议是“无状态”协议,即:服务器一旦响应完客户的请求之后,就断开连接,而同一个客户的下次请求将重新建立网络连接。
  • 服务器应用程序有时是需要判断是否为同一个客户发出的请求,比如客户的多次选购商品。因此,有必要跟踪同一个客户发出的一系列请求。
什么是状态管理?
  • 将客户端(浏览器)与服务器之间多次交互(一次请求,一次响应)当做一个整体来看待,并且将多次交互所涉及的数据即状态保存下来。
  • 状态指的是数据。
  • 管理指的是多次交互时对数据的修改。
状态管理的两种常见模式
  • 客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术。
  • 服务器状态管理技术:将状态保存在服务器端。代表性的是Session技术。

Cookie

什么是Cookie
  • 浏览器向Web服务器发送请求时,服务器会将少量的数据以set-Cookie消息头的方式发送给浏览器,浏览器将这些数据保存下来;
  • 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。
Cookie的原理
如何创建Cookie
  • Servlet API为使用Cookie提供了javax.servlet.http.Cookie
  • 创建:
代码语言:javascript
复制
   Cookie c = new Cookie(String name,String value); 
   response.addCookie(c);
代码语言:javascript
复制
-    name:用于区分不同的Cookie的名字
-    value: Cookie的值
如何查询Cookie
  • 获取客户端的所有Cookie对象:
代码语言:javascript
复制
 Cookie[] request.getCookies();

注:该方法有可能返回null - 获取一个Cookie对象的名称或值

代码语言:javascript
复制
    String Cookie.getName();
    String Cookie.getValue();   
如何修改Cookie
  • step1、获取客户端发送的所有Cookie
  • step2、根据那么找到要修改的Cookie
  • step3、调用Cookie的setValue(String newValue)方法修改该Cookie的值
  • step4、将修改后的Cookie加入到response发送回客户端
  • 【综上就是:增加一个与原Cookie名一样的Cookie来覆盖原来的Cookie,以达到修改的目的。】
代码语言:javascript
复制
Cookie[] Cookies = request.getCookies();
if(Cookies != null){
    for(Cookie c : Cookies){
        String name = c.getName();
        if(name.equals("city"){
            c.setValue("shanghai");
            response.addCookie(c);//同名Cookie会覆盖,以达到修改的目的
        }
    }
}
Cookie的生存时间
  • 默认情况下,浏览器会将Cookie保存在内存中,只要浏览器不关闭,Cookie就一直存在
  • 如果希望关闭浏览器后Cookie仍在,可以通过设置过期时间 void Cookie.setMaxAge(int seconds); 注:seconds单位是秒,精度不是很高
  • seconds > 0 : 浏览器要保存Cookie的最长时间为设置的参数值,如果超过指定的时间,浏览器会删除这个Cookie。此时Cookie保存在硬盘上。
  • seconds = 0:删除Cookie。在修改Cookie的生存时间为0后,随着response发送回客户端,替换原有Cookie,因生命周期到了即将把Cookie删除。
  • seconds < 0:缺省值,浏览器会将Cookie保存到内存中。
Cookie编码
  • Cookie 只能保存合法的ADSCII字符。如果要保存中文,需要将中文转换成合法的ASCII字符,即编码。
代码语言:javascript
复制
Cookie c = new Cookie("city",URLEncoder.encode("北京","utf-8"));
Cookie解码
  • 编码后的Cookie为了看到实际的中文,需要还原后再显示
代码语言:javascript
复制
Cookie[] Cookies = request.getCookies();
if(Cookies != null){
    Cookie c = Cookies[0];
    String value = c.getValue();
    value = URLDecoder.decode(value,"utf-8");//与编码时格式保持一致
} 

Cookie的路径问题

什么是Cookie的路径问题
  • 浏览器在访问服务器上的某个地址时,会比较Cookie的路径与该路径是否匹配,只有匹配的Cookie才会发送给服务器。
  • Cookie的默认路径等于添加这个Cookie的Web组件的路径。
  • 如:/appName/file/addCookie.jsp添加一个Cookie,则该Cookie的路径等于/appName/file
发送Cookie的条件
  • 要访问的地址必须是Cookie的路径或者其子路径时,浏览器才会发送Cookie。
  • 如:
    • Cookie的路径是/appName/file
    • 则访问/appName/file/a.jsp或/appName/file/b.jsp时会发送Cookie
    • 如果访问/appName/c.jsp则不会发送Cookie
如何设置Cookie的路径
  • 使用如下代码段可以设置Cookie的路径
代码语言:javascript
复制
Cookie c = new Cookie("uname","jack");
c.setPath("/appName");
response.addCookie(c);
Cookie的限制
  • Cookie可以被用户禁止
  • Cookie会将状态保存在浏览器端,不安全。对于敏感数据,需要加密后在使用Cookie来保存
  • Cookie只能保存少量的数据,大约4kb左右
  • Cookie的个数是有限制的
  • Cookie只能保存字符串
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年07月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 状态管理
    • 为什么需要状态管理?
      • 什么是状态管理?
        • 状态管理的两种常见模式
        • Cookie
          • 什么是Cookie
            • Cookie的原理
              • 如何创建Cookie
                • 如何查询Cookie
                  • 如何修改Cookie
                    • Cookie的生存时间
                      • Cookie编码
                        • Cookie解码
                        • Cookie的路径问题
                          • 什么是Cookie的路径问题
                            • 发送Cookie的条件
                              • 如何设置Cookie的路径
                                • Cookie的限制
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档