cookie详解

1. 两种会话技术介绍:

    Web应用程序是使用HTTP协议传输数据的,HTTP协议是无状态的协议。客户端向服务器端进行一次请求,会建立一个会话,一旦请求结束,会话也就随之结束。那么当客户端再次向该服务器端发起请求时,再次建立的会话和上次的会话没有任何的关联。比如,用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了,那么该怎么办?所以cookie和session两种会话技术便出现了。

1.1、Cookie
  Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
1.2、Session
  Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

2.cookie的用途以及工作原理:
    它最根本的用途是 Cookie 能够帮助 Web 站点保存有关访问者的信息,以下列举cookie的几种小用途。
    2.1 保存用户登录信息。这应该是最常用的了。当您访问一个需要登录的界面,例如微博、百度及一些论坛,在登录过后一般都会有类似"下次自动登录"的选项,勾选过后下次就不需要重复验证。这种就可以通过cookie保存用户的id。
    2.2 创建购物车。购物网站通常把已选物品保存在cookie中,这样可以实现不同页面之间数据的同步(同一个域名下是可以共享cookie的),同时在提交订单的时候又会把这些cookie传到后台。

    2.3 跟踪用户行为。例如百度联盟会通过cookie记录用户的偏好信息,然后向用户推荐个性化推广信息,所以浏览其他网页的时候经常会发现旁边的小广告都是自己最近百度搜过的东西。这是可以禁用的,这也是cookie的缺点之一。

那么,Cookie是如何起作用的呢?
用户每次访问站点时,Web应用程序都可以读取 Cookie 包含的信息。当用户再次访问这个站点时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就自动将它添加到request header的Cookie字段中,与http请求一起发送到该站点。


3.服务器端cookie的使用:javax.servlet.http.Cookie

    3.1 :设置cookie有效期,setMaxAge(int expiry),当服务器返给前端一个cookie时,如果没有设置有效期,那么默认是在一次会话中有效,此时cookie是存在浏览器缓存中,当关闭浏览器时,会话结束,缓存也就清除了,cookie也就不存在了。如果设置了时间,假如是60分钟,那么关闭浏览器时,存放在浏览器缓存中的cookie会被写入到本地硬盘中,当下次再访问同一个域时,就会自动带上该cookie。(注:经个人验证得知,当cookie过了有效期,本地cookie仍然存在,但是访问服务器时,服务器获取不到该cookie)

   3.2:设置cookie的路径,public void setDomain(String pattern),public void setPath(String uri),domain 和 path 这两个选项共同决定了cookie能被哪些页面共享。domain 参数是用来控制 cookie对「哪个域」有效,默认为设置 cookie的那个域。path用来控制cookie发送的指定域的「路径」,默认为"/",表示指定域下的所有路径都能访问。页面只能获取它属于的Domain和Path的Cookie。看下图:        

     3.3:cookie的修改和删除, 修改是通过创建一个名称相同的cookie,然后添加到response中来覆盖原来的cookie;删除,则设置有效期为0即可。修改cookie时domain、path必须与原cookie保持一致,这样才能覆盖原来的cookie。

     3.4:cookie不能跨域名,即www.taobao.com返回的cookie不会被提交到www.jd.com中去,因为两者域名不同,这也就避免了一个网站去获取其他网站cookie的可能性。name相同,domain不同的两个cookie属于不同的cookie

    3.5:cookie的安全属性:http协议是不安全的。如果想让cookie只在一些安全协议(如https,ssl)中传输,那么通过setSecure(true)来实现。默认情况下在http和https协议中,cookie都能进行传输的。注意:secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密

   3.6:httponly:httponly属性是用来限制客户端脚本对cookie的访问。将 cookie 设置成 httponly 可以减轻xss攻击的危害,防止cookie被窃取,以增强cookie的安全性。

   3.7:举例说明服务器端cookie的使用:

         public class CookieServlet extends HttpServlet {

    /**
     * 获取用户的访问次数
     */
    private static final long serialVersionUID = 2392628224612469760L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置服务器端以UTF-8编码进行输出
        response.setCharacterEncoding("UTF-8");
        // 设置浏览器以UTF-8编码进行接收,解决中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        // 获取浏览器访问访问服务器时传递过来的cookie数组
        Cookie[] cookies = request.getCookies();
        //第几次登录
        int loginNumValue = 0;
        if (null != cookies && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("loginNum")) {
                    loginNumValue = Integer.parseInt(cookie.getValue()) + 1;
                    out.write("该用户是第" + loginNumValue + "次访问");
                    System.out.println(cookie.getPath());
                }
            }
        } else {
            loginNumValue = 1;
            out.write("该用户第一次访问");
        }
        Cookie cookie = new Cookie("loginNum", loginNumValue + "");
        cookie.setMaxAge(300);
        
        response.addCookie(cookie);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doGet(request, response);
    }

}

4.客户端cookie的使用

   4.1 举例说明:

   document.cookie = "test1=newCookie; domain=www.jd.com; max-age=3600; secure";

5.cookie的缺点:
   5.1 安全性:由于cookie在HTTP中是明文传递的,其中包含的数据都可以被他人访问,可能会被篡改、盗用。

   5.2 大小限制:cookie的大小限制在4KB左右,若要做大量存储显然不是理想的选择。

   5.3 增加流量:cookie每次请求都会被自动添加到Request Header中,无形中增加了流量。cookie信息越大,对服务器请求的时 间也越长。

  

参考资料:

 https://segmentfault.com/a/1190000004743454#articleHeader15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值