Cookie和Session

Cookie和Session

会话

  • 什么是会话?

    会话是浏览器和服务器之间的多次请求和响应

    也就是说,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话

  • 有状态会话:一个网站知晓你登陆过、存储了一些基本信息

保存会话的两种技术

  1. cookie:
    • 一种客户端技术,服务器响应相关信息给浏览器,保存在浏览器本地
  2. session:
    • 服务器技术,保存会话信息到服务器中,把信息和数据放在session中

Cookie是一种存储在计算机浏览器目录中的文本文件

一个例子:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");

        PrintWriter out = resp.getWriter();
        //cookie 服务器端从客户端取得
        Cookie[] cookies = req.getCookies();//这里返回数组
//        判断cookie是否存在
        if(cookies!=null){
            out.print("你第一次访问的时间是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                if(cookie.getName().equals("LastLoginTime")){
//                    显示最后一次登录的值
                    long l = Long.parseLong(cookie.getValue());
                    Date date = new Date(l);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.print("这是你第一次访问网站");
        }
//        服务器给客户端响应cookie
        Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
        resp.addCookie(cookie);

    }

第一次访问:

第二次访问:

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • cookie大小有限制4kb
  • 300个cookie浏览器上限

删除cookie

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

  • 设置有效期

    //        服务器给客户端响应cookie
            Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
    //        设置有效期为0
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
    

如果cookie设置为中文可能会出现乱码:可以通过以下方法解决

URLDecoder.decode(cookie.getValue(),"UTF-8");解码
URLEncoder.encode("啊","utf-8");编码

Session

  • 服务器会给每一个用户(浏览器)创建一个session对象
  • 一个Session独占一个浏览器,只要浏览器没关,session就存在

Session和cookie区别:

  • cookie是把用户的数据保存在浏览器
  • session把用户的数据写到用户独占session中,服务器端保存
  • session对象由服务创建

创建场景:

  • 保存一个登录用户的信息
  • 购物车信息
  • 整个网站经常使用的数据

使用例子:

    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","lihua");
//        获得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响应回去,键值分别为JSESSIONID,和session的Id,浏览器通过这个判断session是否已经创建,和辨别不同的用户

结果:可以看出不同浏览器id不同

另外一些其他方法:

session.removeAttribute("name");//删除键值
session.invalidate();//注销session
//注销后重新生成一个id,相当于重新登录或关闭浏览器

也可以在web.xml中设置默认失效时间

<session-config>
    <!--    设置session默认失效时间:1分钟-->
    <session-timeout>1</session-timeout>
</session-config>

热门相关:峡谷正能量   天神诀   锦乡里   重生野性时代   道君