Cookie

1,会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭资源,这个过程称为会话

 Cookie作用

    

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

Cookie缺陷:

  1. Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
  2. 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用超文本传输安全协定
  3. Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。[3]

有状态会话:

  理解:

    Cookie:服务端给客户端的一个信件,客户端下次访问服务端带上信件就可以了

    Session:服务端登记你来过了,下次来时在服务端匹配session

  cookie和session的区别:

      1.Session比Cookie安全,

      2.Session是存储在服务器端的,Cookie是存储在客户端的

1.2 保存会话的两种信息

  cookie

    客户端技术 (响应,请求)

  session

    服务器技术,利用这个技术,可以保存用户会话信息,可以把信息或者数据放在session中

  常见案例:网站登录之后,下次不用再登录,第二次访问就直接进入

1.3 Cookie

  1.从请求中拿到cookie信息

  2.服务器响应给客户端cookie

  

 1. Cookie[] cookies = req.getCookies();//获得cookie方法
 2. cookie.getname();//获得cookie中的key
 3. cookie。getvalue();//获得cookie中的value
 4.new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一个cookie
 5.cookie.setMaxAge(24*60*60);设置有效期
 6.resp.addCookie(cookie);//响应给客户端cookie

cookie:一般保存在本地的用户目录下appdata;

一个网站cookie是否存在上限!

  一个Cookie只能保存一个信息

  一个web站点可以给浏览器发送多个cookie,最多存放cookie

  Cookie大小有限制4kb

  300个cookie浏览器上限

删除Cookie:

  不设置有效期,关闭浏览器,自动失效;

  设置有效期时间 0 ;

获取cookie

package com.king.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

//保存用户上一次访问时间
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器把客户端上一次访问的时间封装成一个cookie,下次来时,就可凭cookie。被服务端识别

        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");


        PrintWriter out = resp.getWriter();

        //cookie,服务器端从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可返回多个

        //判断cookie是否存在
        if(cookies!=null){
            //如果存在的操作
            out.write("你上一次访问的时间是:");

            for (Cookie cookie : cookies) {
                //获取cookie的名字
                if(cookie.getName().equals("lastLoginTime")){
                    //获取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());

                }
            }

            

        }else{
            out.write("这是您第一次访问本站");
        }

        //服务器给客户端响应一个cookie;
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");

        //设置cookie有效期一天
        cookie.setMaxAge(24*60*60);

        resp.addCookie(cookie);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

删除cookie

package com.king.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //服务器给客户端响应一个cookie;
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");

        //设置cookie为0,立马过期
        cookie.setMaxAge(0);

        resp.addCookie(cookie);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

    <servlet>
        <servlet-name>CookieDemo01</servlet-name>
        <servlet-class>com.king.servlet.CookieDemo01</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>CookieDemo01</servlet-name>
        <url-pattern>/c1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>CookieDemo02</servlet-name>
        <servlet-class>com.king.servlet.CookieDemo02</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>CookieDemo02</servlet-name>
        <url-pattern>/c2</url-pattern>
    </servlet-mapping>

</web-app>

  

  

原文地址:https://www.cnblogs.com/CL-King/p/13772900.html