Cookie和Session

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

有状态会话:一个同学来过教室 下次再来教室 我们会知道这个同学曾经来过
        一个网站 怎么证明你来过?
                客户端        服务端

                        1.服务端给客户端一个信件 客户端下次访问服务端带上信件就可以了  cookie
                        2.服务器登记你来过了 下次你来的时候我来匹配你 session

保存会话的两种技术
·cookie
        客户端技术(响应、请求)
        Cookie 一般用来保存用户信息
 比如 ① 我们在 Cookie 中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你把登录的一些基本信息给填了;② 一般的网站都会有保持登录,也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③ 登录一次网站后访问网站其他页面不需要重新登录。

·session
        服务器技术,利用这个技术可以保存用户的会话信息 我们可以把信息或数据放在Session中
        Session 的主要作用就是通过服务端记录用户的状态。
 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。在整个网站中经常会使用的数据 我们将它保存在Se's'si

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。

        Cookie 存储在客户端中,而 Session 存储在服务器上,相对来说 Session 安全性更高。如果要在 Cookie 中存储一些敏感信息,不要直接写入 Cookie 中,最好能将 Cookie 信息加密,然后使用到的时候再去服务器端解密。

       Cookie是把用户的数据写给用户的浏览器 浏览器保存(可以存多个)
       Session把用户的数据写到用户独占Session中 服务器端保存(保存重要信息 减少服务器资源的浪费) 其对象(session对象)由服务器创建

Cookie
        ①从请求中拿到cookie信息
        ②服务器响应给客户端cookie

Cookie[] cookies = req.getCookies();//获得Cookie
cookie.getName();//获得cookie中的key
cookie.getValue();//获得cookie中的value
new Cookie("shijian", System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie有效期
resp.addCookie(cookie);//响应给客户端一个cookie
cookie一般会保存在本地的用户目录下 appdata

一个网站Cookie是否存在上限?
        ·一个cookie只能保存一个信息
        ·一个web站点可以给浏览器发送多个cookie 最多存放20个cookie
        ·cookie大小有限制 大概为4kb
        ·浏览器的上限是300个cookie

删除cookie
        ·不设置有效期 关闭浏览器 自动失效
        ·设置有效期时间为0

代码:

package com.kero.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 CookieDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        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 (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                boolean name = cookie.getName().equals("shijian");
                if(name){
                    long l = Long.parseLong(cookie.getValue());
                    Date date = new Date(l);
                    out.write(date.toString());
                }
            }
        }else{
            out.write("这是您第一次访问本站");
        }

        //服务器给客户端相应一个cookie
        Cookie cookie = new Cookie("shijian", System.currentTimeMillis()+"");
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);


    }
}

//删除cookie

package com.kero.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 CookieDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //创建一个cookie 名字必须和要删除的名字一致
        Cookie cookie = new Cookie("shijian",System.currentTimeMillis()+"");
        //将cookie有效期设置为0
        cookie.setMaxAge(0);
        resp.addCookie(cookie);


    }
}


 

Session
        ·
服务器会给每一个用户(浏览器) 创建一个session对象
        ·一个session独占一个浏览器 只要浏览器没有关闭 这个session就存在
        ·用户登录之后 整个网站它都可以访问--->保存用户信息、保存购物车信息....


代码:

package com.kero.servlet;

import com.kero.pojo.Person.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session = req.getSession();

        //给Session中存东西
        session.setAttribute("name",new Person("张柯",20));
        //获取session的id
        String id = session.getId();

        //判断session是不是新创建的
        if(session.isNew()){
           resp.getWriter().write("session创建成功,ID:"+id);
        }else{
            resp.getWriter().write("session已经存在,ID:"+id);
        }
//        //Session创建的时候做了什么事情
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);
    }

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

// 得到session

package com.kero.servlet;

import com.kero.pojo.Person.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session = req.getSession();

        Object name = (Person)session.getAttribute("name");
        System.out.println(name);
    }

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

//手动注销session

package com.kero.servlet;

import com.kero.pojo.Person.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

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

        //得到Session
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        session.invalidate();
    }

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

//自动注销session(会话自动过期) 在web.xml文件中配置文件 以分钟为单位

<session-config>
  <session-timeout>1</session-timeout>
</session-config>



        
        

        
        

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值