Cookie

会话技术
会话 –> 打开浏览器/关闭浏览器 ==> 会话开始&结束
会话技术 –> 保存在一次网络交互中临时产生的数据

–> 在浏览器端和服务器端记录信息
浏览器端 –> cookie
服务器端 –> session

应用场景
自动登录、浏览记录、购物车。

为什么要有这个Cookie
http的请求是无状态。
客户端与服务器在通讯的时候,是无状态的
–> 其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访问过。 为了更好的用户体验,更好的交互 [自动登录]
从公司层面讲,就是为了更好的收集用户习惯[大数据]

Cookie怎么用

运行原理:
当浏览器去访问服务器的时候,服务器可以帮浏览器创建一个键值对的数据(key-value)
其实这个键值对 就是cookie对象

当完成正常的业务逻辑之后,在响应内筒中可以将cookie进行添加
–> response对象中把这个Cookie对象带给浏览器
–> 浏览器接收这个响应后,解析,按照一定的规则进行保存(默认在内存上)
–> 当下次访问浏览器时,request.把cookie带回给服务器,服务器解析
–> 一旦关闭浏览器,再次打开已经没有cookie(默认内存)

注意事项
–> 不支持中文
–> 不能跨浏览器
–> 有大小限制,4kb
对一个网站最多接受20个cookie
这个浏览器时300个

常用方法

创建cookie
Cookie cookie = new Cookie();
服务器将cookie发送给流浪器
response.addCookie(cookie);
获取带回来的cookie
Cookie[] cookies = request.getCookies();
遍历得到每一个cookie
Cookie里的API
getName()
getValue()

response.addCookie();

会话级别
默认情况下关闭浏览器后,cookie就没有了。 —> 针对没有设置cookie的有效期。
持久化级别

cookie.setMaxAge(60 * 60 * 24 * 7); –> 设置会话时间
–> 将cookie可持久化的存储
expiry: 有效 以秒计算。
//正值 : 持久级别 表示 在这个数字过后,cookie将会失效。
//负值:会话级别 关闭浏览器,那么cookie就失效, 默认值是 -1
//0: 立即删除cookie(同名同 路径)

//赋值新的值
cookie.setValue(newValue);

//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(“.itheima.com”);

cookie.setPath(“/CookieDemo”);
–> 只有访问该域名下的cookieDemo的这个路径地址才会带cookie
–> 路径是请求服务器的时候,路径的上一级
–> 默认路径是项目目录,路径即可自定义

包含关系
cookie
name /cookie
value /cookie/c
浏览器访问服务器的时候,若服务器地址是(项目/cookie/c)
–> 能获取到name value两者的内容
浏览器访问服务器的时候,若服务器地址是(项目/cookie)
–> 只能获取name的内容
==> 判断当前的请求路径是不是与cookie的路径有包含关系
若访问路径被包含,可以获取
若为包含,则无法获取
删除cookie

//删除name的cookie
//创建同名的cookie
Cookie cookie = new Cookie(“name”, null);
//同路径
cookie.setPath(“/develop_iservlet_cookiesession”);
//设置存活时间
cookie.setMaxAge(0);
//告知浏览器
response.addCookie(cookie);

简单使用:

客户端添加Cookie
1. 在响应的时候,添加cookie
Cookie cookie = new Cookie(“aa”, “bb”);
//给响应,添加一个cookie
response.addCookie(cookie);

–> 可以为客户返回多个cookie

  1. 客户端收到的信息里面,响应头中多了一个字段 Set-Cookie

获取客户端的Cookie
//获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName + ” = “+ cookieValue);
}
}

例子一 显示最近访问的时间。
1. 判断账号是否正确
2. 如果正确,则获取cookie。 但是得到的cookie是一个数组, 我们要从数组里面找到我们想要的对象。
3. 如果找到的对象为空,表明是第一次登录。那么要添加cookie
4. 如果找到的对象不为空, 表明不是第一次登录。
public class LastTimeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=UTF-8”);
//尝试获取cookie
Cookie cookie = getCookie(request);
//如果空,第一次
if (cookie == null){
//完成第一次的访问
response.getWriter().write(“首次访问”);
}else{
//获取value
String value = cookie.getValue();
//解析时间(毫秒值),再次存储到cookie中
Date date = new Date(Long.parseLong(value));
response.getWriter().write(“上次访问时间是:——” + date.toLocaleString());
}
cookie = new Cookie(“lastTime”,new Date().getTime() + “”);
response.addCookie(cookie);
}
//封装方法,获取cookie
public Cookie getCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
if (cookie.getName().equals(“lastTime”)){
return cookie;
}
}
}
return null;
}
}

例子二: 显示商品浏览记录。

准备工作
拷贝基础课第一天的 htmll原型文件,到工程的WebContent里面。
在WebContent目录下新建一个jsp文件, product_list.jsp, 然后拷贝原来product_list.html的内容到jsp里面。 建好之后,jsp里面的所有ISO-8859-1 改成 UTF-8
拷贝html标签的所有内容。 替换jsp的html标签即可
修改product_info.htm里面的手机数码超链接地址 product_list.jsp

  • 手机数码(current)
  • 修改首页(index.html)顶部的手机数码跳转的位置为 product_list.jsp
  • 手机数码(current)
  • Java代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取当前用户准备浏览的ID
        String id = request.getParameter("id");
        //获取cookie数组
        Cookie[] cookies = request.getCookies();
        //使用工具包,获取想要的对象
        Cookie cookie = CookieUtil.findCookie(cookies, "history");
        //第一次浏览
        if(cookie == null) {
            //1.响应返回cookie
            Cookie c = new Cookie("history",id);
            //设置有效期
            c.setMaxAge(60*60*24*7);
            //设置访问这个工程的时候,才会带cookie过来
            c.setPath("/CookieDemo02");
            response.addCookie(c);
            //2.跳转到具体界面
    

    // response.sendRedirect(“product_info.html”);
    }else {
    //获取以前的cookie,因为以前的cookie,包含了浏览记录
    String ids = cookie.getValue();
    //让现在浏览的商品,和以前浏览的商品,形成cookie新的值
    cookie.setValue(id + “#” +ids);
    //设置有效期
    cookie.setMaxAge(60*60*24*7);
    //设置访问这个工程的时候,才会带cookie过来
    cookie.setPath(“/CookieDemo02”);
    response.addCookie(cookie);
    }
    // 3.跳转到具体界面
    response.sendRedirect(“product_info.htm”);
    }

    Jsp 里面使用Java代码
    ● jsp
    Java Server Pager —> 最终会翻译成一个类, 就是一个Servlet
    ● 定义全局变量
    <%! int a = 99; %>
    ● 定义局部变量
    <% int b = 999; %>
    ● 在jsp页面上,显示 a 和 b的值,
    <%=a %> <%=b %>

    清除浏览记录
    其实就是清除Cookie, 删除cookie是没有什么delete方法的。只有设置maxAge 为0 。
    Cookie cookie = new Cookie(“history”,”“);
    cookie.setMaxAge(0); //设置立即删除
    cookie.setPath(“/CookieDemo02”);
    response.addCookie(cookie);

    Cookie总结

    1. 服务器给客户端发送过来的一小份数据,并且存放在客户端上。
    2. 获取cookie, 添加cookie
      request.getCookie();
      response.addCookie();
    3. Cookie分类
      会话Cookie 默认情况下,关闭了浏览器,那么cookie就会消失。
      持久Cookie
      在一定时间内,都有效,并且会保存在客户端上。

      cookie.setMaxAge(0); //设置立即删除

      cookie.setMaxAge(100); //100 秒
    4. Cookie的安全问题。
      由于Cookie会保存在客户端上,所以有安全隐患问题。
      Cookie的大小与个数有限制。 为了解决这个问题 —> Session .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值