Cookie和Session
Cookie和Session
一、会话
用户打开了一个浏览器,点击了很多个链接,访问很多个web资源,然后关闭浏览器,这个过程称之为会话
思考问题:在这个会话的过程中,服务端是如何知道客户端是否曾经访问过呢?(就好比超市是如何区分新顾客还是老顾客呢)
答案:第一种方式:超市给来过的每位客户发一个超市专属的购物卡,每次结账之后出示购物卡就可以了;【Cookie】
第二种方式:每位客户来到超市直接注册一个超市的账号,这样子每次结账只需说明自己的电话号码便可;【Session】
二、保存会话的两种技术
Cookie:客户端技术(请求和响应)
Session:服务器端技术(在服务端保存客户端会话的信息)
使用场景:网站登录之后,下次不用再次登录就可以直接进行访问
三、Cookie
从请求中拿到Cookie信息
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求和响应的字符集(解决中文乱码问题)
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
//客户端从服务器端拿到Cookie
Cookie[] cookies = req.getCookies();
if (cookies != null){
out.write("第一次访问的时间是:");
for (int i = 0; i < cookies.length ; i++) {
Cookie cookie = cookies[i];
//cookie的名字进行比对
if (cookie.getName().equals("time")){
//获取cookie中的值
long time = Long.parseLong(cookie.getValue());
Date date = new Date(time);
out.write(date.toLocaleString());
}
}
}else {
resp.getWriter().println("这是第一次访问");
}
Cookie cookie = new Cookie("time",System.currentTimeMillis()+"");
//设置cookie有效期为一天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
服务器端响应给客户端cookie

一个cookie只能保存一个信息,一个web网站可以给浏览器发送多个cookie,最多存放20个
四、删除Cookie的方式:
不设置有效期,关闭浏览器便会自动失效
设置有效期时间为0
五、Session
1、什么是Session?
在web应用的用户来说,登录一个网站,需要创建一个数据结构以存储用户的登录信息,这个结构叫做session;
服务器会给每一个用户创建一个Session对象
一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
翻译过来就是:当用户访问某个网页的时候,就会在服务端开辟一块内存,这块内存就是session,而这个内存是跟浏览
器的窗口相互关联的,只允许当前这个session对应的浏览器窗口访问;
2、Session实现原理
当服务器端创建完Session对象之后,会把Session对象的SessionId以Cookie的形式返回给客户端,然后客户端SessionId 传递给服务器端,服务器根据SessionId来为用户提供服务(注意:这个SessionId就是浏览器和服务器之间一一对应的 唯一标识)
3、Session的两种实现方式
第一种实现方式:通过Cookie来实现

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("name",new Person("汤姆",2));
//获取Session的Id
String sessionId = session.getId();
//判断Session是不是新创建的
if (session.isNew()){
resp.getWriter().write("Session创建成功,ID:"+sessionId);
}else {
resp.getWriter().write("Session已经在服务器中存在了,ID:"+sessionId);
}
}
@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();
Person person = (Person) session.getAttribute("name");
String s = person.toString();
resp.getWriter().write(s);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//手动注销Session
session.invalidate();
}
第二种实现方式:通过Url重写来实现 (如何重写Url?通过response.encodeURL()方法)

4、会话自动过期:Web.xml配置
<!--设置session默认的失效时间-->
<session-config>
<!--1分钟后session自动失效-->
<session-timeout>1</session-timeout>
</session-config>
5、使用场景
例如保存购物车的信息就可以保存在Session中
或者在网站中经常会使用到的信息
六、Session和Cookie的区别
Session是存储在服务端,Cookie是存储在客户端
Cookie是把用户的数据写给用户的浏览器(例如把用户的账号密码写到用户的浏览器缓存中)
Session技术是把用户的数据写到用户独占的session中,session又是保存在服务器端的
Session对象是由服务器端创建的,可以通过request请求getSession方法得到session对象

浙公网安备 33010602011771号