Cookie和Session
会话:打开浏览器直到一次关闭浏览器,叫一次会话
保存会话的两种技术
cookie
客户端技术 (响应,请求)
session
服务端技术 利用此技术可以保存客户的会话信息,可以将信息和数据放在session中
Cookie
cookie是由服务端生成的由客户端保存,相当由本地缓存。
方法
Cookie[] cookies = req.getCookies();//获取cookie
cookie.getName()//获取cookie的key
cookie.getValue()//获取cookie的value
Cookie cookie = new Cookie(String, String);//创建一个新的cookie
cookie.setMaxAge();//设置cookie的有效期
resp.addCookie(Cookie);//添加cookie
@WebServlet("/cookie")
public class CookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();//获取cookie
if (cookies != null){
out.println("上次访问时间");
for (Cookie cookie: cookies){
if (cookie.getName().equals("time")){//获取cookie的key
long aLong = Long.parseLong(cookie.getValue());//获取cookie的value
Date date = new Date(aLong);
out.println(date.toLocaleString());
}
}
}else {
out.println("首次访问");
}
Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");//创建一个新的cookie
//cookie有效期为一天
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//添加cookie
}
}
一个cookie存在的上限:
一个cookie只能存一个信息
一个web网站可以给浏览器发送多个cookie,最多存放20个cookie
cookie大小限制4kb
浏览器cookie上限300个
删除cookie:
不设置有效期,关闭浏览器cookie自动删除
设置有效期为0
编码解码
URLDecoder.decode(c.getValue(), "UTF-8")//解码
URLEncoder.encode("中国", "UTF-8")//编码
Session(重点)
cookie和session如何进行匹配?
当客户端去访问服务器,此时会产生一个session对象,会有一个自带的sessionID,将sessionID复制一份,给JESSIONID,将 JESSIONID放入带cookie中。
客户端的JESSIONID和服务端的sessionID一一对应,用于区分客户。
什么是session?
服务器会为每一个用户(浏览器)创建一个Session对象。
一个session独占一个浏览器,只要浏览器没有关闭,这个session就会存在。
用户登录以后,整个网站都可以访问。
cookie和session的区别
cookie把数据存储在客户端(可以保存多个),session将数据存储在服务器(保存重要的信息,减少服务器资源的浪费)
session使用场景
保存一个登录用户信息
购物车信息
整个网站中经常会使用的数据,将其存在session中
销毁session的方法
<!--web.xml-->
<session-config>
<!-- 设置超时时间 10分钟后自动销毁-->
<session-timeout>10</session-timeout>
</session-config>
//手动注销
HttpSession session = req.getSession();
session.invalidate();//销毁session
使用session
@WebServlet("/session")
public class SessionServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
HttpSession session = req.getSession();//获取session
session.setAttribute("person", new Person("www", 10, "fruit"));//在session中放置属性
session.setAttribute("name", "www");
String id = session.getId();//获取session的id
if (session.isNew()){//判断session是否创建
resp.getWriter().write("首次创建session,id:" + id);
}else {
resp.getWriter().write("获得session,id:" + id);
}
}
}
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("person");//获取session的属性
String name = (String) session.getAttribute("name");
resp.getWriter().println(person);
resp.getWriter().println(name);
HttpSession session = req.getSession();
session.invalidate();//销毁session
如有不对的地方欢迎指出,大家共同进步!