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成功!");
}
}
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("");
for (Cookie c :cookies) {
writer.write(c.getName()+":"+c.getValue());
writer.write("
");
}
writer.write("");
}
}
setMaxAge
设置Cookie的过期时间.超过这个时间, Cookie就失效了,浏览器就自动删除这个Cookie
如果把setMaxAge(0) ,意味着立刻删除Cookie
这种操作这是服务器删除Cookie的方式.这都是保存在浏览器的. (用户可以随意修改)很少使用这个机制.控制cookie是不可靠的。
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("");
writer.write("count: "+count);
writer.write("");
}
}
不同的浏览器Session不一样,给每个用户分配一个唯一的 sessionld,不同的用户会有不同的sessionld.,而在服务器端,就会保存不同的键值对,也就会有不同的HttpSession对象
也就保存不同的count内容.
如果cookie中没有sessionld,或者有sessionld但是服务器中查找不到,都是新用户.
如果发现是新用户,就创建新的sessionld,创建新的键值对.
新用户的请求,没有cookie或者cookie中的sessionld在服务器中查不到.
新用户服务器就会在调用getSession的时候创建新的sessionld, 并通过响应返回给浏览器,保存到Cookie中.
浏览器如果继续访问服务器,就会在Cookie中自动带上这个新的sessionld
进而,服务器就可以根据这个sessionld来找到之前保存的访问次数.
SessionId和上面的相同,在服务器上获取到对应的Session对象,再获取到对应的count值.