Servlet——Servlet中Cookie和Session

Cookie

cookie是字符串,是客户端保存数据的一种方式。
1.从哪来?
服务器通过Set-Cookie字段返回的内容.
2.怎么存的?
浏览器按照域名/地址,分别存储,组织成键值对的结构.
3.到哪去?
下次请求的时候就通过请求中的Cookie字段自动把Cookie数据带到服务器端了.

往浏览器中写入cookie,再在Tomcat进行部署

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;


//服务器给浏览器写回Cookie
public class ServletDemo7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、先构造Cookie对象,一个Cookie对象就是一个键值对
        Cookie userName = new Cookie("userName","hhh");
        Cookie age = new Cookie("age",18+"");
        //2、把Cookie放到响应中
        resp.addCookie(userName);
        resp.addCookie(age);
        //创建一个响应报文
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("返回Cookie成功!");


    }
}

在这里插入图片描述
通过读取请求,获取到浏览器发来的Cookie内容

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.Writer;

//通过读取请求,获取到浏览器发来的Cookie内容
public class ServletDemo8 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        resp.setContentType("text/html; charset=utf-8");
        Writer writer = resp.getWriter();
        writer.write("<html>");
        for (Cookie c :cookies) {
            writer.write(c.getName()+":"+c.getValue());
            writer.write("<br/>");

        }
        writer.write("</html>");

    }
}

在这里插入图片描述
setMaxAge
设置Cookie的过期时间.超过这个时间, Cookie就失效了,浏览器就自动删除这个Cookie
如果把setMaxAge(0) ,意味着立刻删除Cookie
这种操作这是服务器删除Cookie的方式.这都是保存在浏览器的. (用户可以随意修改)很少使用这个机制.控制cookie是不可靠的。

Session

Session:服务器存储数据的一种方式,也是通过键值对的方式来组织的.
key就是sessionld, value就是一个具体的Session . (Session中又可以包含- -些用户自定制的内容)

写一个页面,通过这个页面来记录当前用户访问了几次.



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;
import java.io.Writer;

public class ServletDemo9 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、先获取Session,如果用户曾经没有访问过,此时将创建新的session
        //如果用户已经访问过了,就获取到曾经的Session
        //新用户初次访问:
        //这个操作会自动生成一个sessionId,同时创建一个httpSession对象
        //把这个键值对放到内置的hash表中,同时把session写回到浏览器的Cookie中
        //老用户访问:
        //根据请求中Cookie里的sessionId,在hash表中查,找到对应的session对象
        HttpSession httpSession = req.getSession(true);
        //2、判断是否是新用户
        Integer count = 1;
        if(httpSession.isNew()){
            //新用户
            //把count值写入session对象中
            //httpSession也可以当成一个hash表、
            httpSession.setAttribute("count",count);
        }else {
            //老用户
            //从httpSession 中读取count值
            count = (Integer) httpSession.getAttribute("count");
            count = count+1;
            //count 自增完成后需要重新写入session
            httpSession.setAttribute("count",count);
        }

        //返回响应页面
        resp.setContentType("text/html; charset=utf-8");
        Writer writer = resp.getWriter();
        writer.write("<html>");
        writer.write("count: "+count);
        writer.write("</html>");

    }
}

不同的浏览器Session不一样,给每个用户分配一个唯一的 sessionld,不同的用户会有不同的sessionld.,而在服务器端,就会保存不同的键值对,也就会有不同的HttpSession对象
也就保存不同的count内容.

在这里插入图片描述

如何判定当前访问是新用户的呢?

如果cookie中没有sessionld,或者有sessionld但是服务器中查找不到,都是新用户.
如果发现是新用户,就创建新的sessionld,创建新的键值对.

删掉浏览器中的Cookie

新用户的请求,没有cookie或者cookie中的sessionld在服务器中查不到.
在这里插入图片描述

新用户服务器就会在调用getSession的时候创建新的sessionld, 并通过响应返回给浏览器,保存到Cookie中.
在这里插入图片描述
浏览器如果继续访问服务器,就会在Cookie中自动带上这个新的sessionld
进而,服务器就可以根据这个sessionld来找到之前保存的访问次数.
在这里插入图片描述
SessionId和上面的相同,在服务器上获取到对应的Session对象,再获取到对应的count值.

猜你喜欢

转载自blog.csdn.net/char_m/article/details/107337714