01_会话技术的概述
会话技术会话可以简单理解为,一个用户打开一个浏览器,在同一个WEB应用上,点击多个超链接,访问多个WEB资源,
然后关闭浏览器,那这整个过程我们称之为一个会话
作用
会话技术可以保存用户在会话过程中所产生的数据
会话技术也可以让用户在同一个会话中实现数据的共享
想保存数据到购物车 不重要 个人私有
保存哪里 服务器? 数据库 淘宝 京东 不登录
编程最重要的域对象 域对象 临时存储数据
浏览器
可能会被清掉 服务器怎么知道浏览器里面有购物车数据 --每次访问服务器的时候把这个数据给带过去
服务器
占用空间 弄混 我怎么识别这个数据是谁的 我怎么让用户证明这个数据是他的
存在浏览器,主要问题是带来带去 存服务器主要问题是 我要识别这个数据是谁的
归根到底: 会话技术就是用来临时保存数据的
02_会话技术的分类
cookiecookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set-cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上,
当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
session
session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象,
由于session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
session对象也是一个域对象,范围是整个会话
注意:
cookie 把数据保存在用户的硬盘上
session 把数据保存在服务器的内存上
会话: 打开淘宝--浏览--关闭 一个会话
cookie
存在浏览器
1,服务器先创建出来
2,随着响应带到浏览器,然后浏览器做临时保存,保存完之后,下次请求在带回去
优点:减少服务器的压力,服务器内存可以少用一点
缺点:
1,换一个浏览器就获取不到
2,随时都会被清理,适合保存不重要的东西
3,带来带去,占用带宽,适合存小的东西,如果过大,用户等待的时候很长
4,数据传来传去, 不安全
总结: 不必要的,比较小的,不涉及安全性的内容,用cookie
session
存在服务器
session 就是一个域对象,(setAttribute getAttribute,removeAttribute),就是通过这个保存数据
03_记录用户上次访问时间分析 访问网站统计量
第一次访问服务器端
判断是否有cookie信息,给出欢迎提示,记录本次访问时间
发送响应头
再次访问
服务器端
判断是否有cookie信息,显示上次访问时间,记录本次访问时间
发送响应头
对于cookie 需要关注
1,在服务器端怎么创建一个cookie//Cookie c = new Cookie("lastAccessTime",now);
2,如何把cookie响应到客户端 //response.addCookie(c);
3,在浏览器发送回来的时候,我们服务器端怎么获得这个cookie//Cookie[] cs = request.getCookies();
04_记录用户上次访问时间
1,拿到指定的cookie信息2,判断是否为null
如果为null,给出提示信息
否则,获取上次的访问时间,并显示
3,获得当前的时间存在cookie当中,发到客户端
步骤; //记录用户上次的访问时间 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //获取cookie信息 Cookie[] cs = request.getCookies(); Cookie cookie = null; if(cs != null) { for (int i = 0; i < cs.length; i++) { String name = cs[i].getName(); if("lastAccessTime".equals(name)) { cookie = cs[i]; break; } } } //判断是否有上次的访问时间 if(cookie == null) { //如果没有上次的访问时间,需要给出提示信息 out.println("欢迎第一次访问"); } else { //如果有上次的访问时间,需要获取上次的访问时间并显示 String value = cookie.getValue(); out.println("您上次的访问时间为:" + value); } //获取这次的访问时间(当前的系统时间) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String now = sdf.format(new Date()); //创建Cookie对象 Cookie c = new Cookie("lastAccessTime",now); //记录用户这次的访问时间,并发送至客户端 response.addCookie(c);
05_封装获取Cookie对象的功能
/* * 根据指定的cookie名称返回其对应的cookie对象 * 参数: * 1.Cookie[] * 2.cookie的名称 * 返回值: * 1.如果查找到了想要的cookie对象,返回这个cookie对象 * 2.如果没有查找到想要的cookie对象,返回null * */ public static Cookie getCookie(Cookie[] cs,String name) { if(cs != null) { for (int i = 0; i < cs.length; i++) { String cookieName = cs[i].getName(); if(cookieName.equals(name)) { //说明找到了想要的cookie对象 return cs[i]; } } } return null; }
06_cookie的细节
一个cookie只能用来标识一种信息,而cookie至少需要包含这个信息的名称和值一个网站可以向一个浏览器提供多个cookie,而一个浏览器也可以接收多个网站所提供的cookie
一个浏览器一般最多可以接收300个cookie,一个网站所对应的cookie最多为20个,一个cookie大小限制为4kb
创建一个cookie对象,发送至客户端,那这个cookie他默认的级别是会话级别
会话级别:当用户关闭浏览器,会话结束了,那这个cookie也被删除了
如果需要把cookie保存在用户的硬盘上,需要设置cookie的有效时间(过期时间)
cookie的名称和值都不可以使用中文,因为中文被认为是不安全的字符
07_Cookie的常用方法
构造方法 Cookie(String name,String value); 获取名称 String getName(); 获取值 String getValue(); 设置有效时间(过期时间) void setMaxAge(int expiry) 设置路径 void setPath(String uri)//雾霾 江苏 南京市 上海 当用户访问这个路径下的web资源,或者是这个路径下子路径的资源,他都会自动携带这个cookie 设置有效时间 cookie.setMaxAge(60 * 60 * 24);//有效期一天 cookie.setMaxAge(-1);//当浏览器关闭,会话结束后cookie会自动的被删除 cookie.setMaxAge(0);//cookie会立刻被删除 cookie.setMaxAge(Integer.MAX_VALUE);//最长的有效时间 设置路径 cookie.setPath("/myCookie");//cookie的默认路径是当前WEB应用的根路径 cookie.setPath(request.getContextPath());//推荐使用这个方法,比较灵活
08_记住用户名
经典的Cookie应用场景
LoginUIServlet 登录UI界面,只负责展示页面
LoginServlet 提交之后的跳转页面,负责处理逻辑判断
IndexServlet 登录成功之后的跳转页面
09_记住用户名2
LoginServlet 提交之后的跳转页面,负责处理逻辑判断登录成功之后,根据记住用户名复选框的状态来设置Cookie
if ("1".equals(remember)) { //需要记住用户名 //创建Cookie对象 Cookie cookie = new Cookie("username", username); //设置cookie的有效时间 cookie.setMaxAge(Integer.MAX_VALUE); //发送cookie至客户端 response.addCookie(cookie); }else { //不需要记住用户名 Cookie cookie = new Cookie("username", ""); cookie.setMaxAge(0); response.addCookie(cookie); }LoginUIServlet 登录UI界面,只负责展示页面
获取cookie Cookie[] cs = request.getCookies(); Cookie cookie = CookieUtils.getCookie(cs, "username"); String username = ""; String checked = ""; if (cookie != null) { username = cookie.getValue(); checked = "checked = 'checked'"; } 填充数据 out.println("用户名:<input type='text' name='username' value='"+username+"' />"); out.println("<input type='checkbox' name='remember' value='1'"+checked+" />记住用户名")
10_session的概述
域对象需要掌握
1,怎么获取session对象
2,什么时候用session对象
3,怎么存数据 取数据 销毁
WEB服务器可以为每一个来访的用户浏览器创建一个会话对象(session对象),
如果需要保存用户的数据,我们的程序可以把用户的数据保存在用户浏览器独享的session对象中,
如果用户再次的使用浏览器来访问其他的WEB资源,其他的WEB资源也可以通过session对象来获取这个用户的数据,以便为这个用户再次的服务
session对象由WEB服务器创建,我们可以通过请求对象的方法getSession()来获取。
cookie和session的区别
cookie
是一种客户端技术,有大小和数量的限制,把数据保存在客户端,所以相对的不安全
session
是一种服务器端技术,没有大小和数量的限制,把数据保存在服务器端,所以相对的安全
如何区分一个session是哪个用户的,这个才是最难
银行 开保险柜 给你钥匙
关键点: 这个钥匙,怎么给到客户 如何让客户每次来的时候都带上钥匙 用的cookie
所以某种意义上 session依赖于cookie id id存在cookie
11_session的实现原理
基于cookie
第一次调用 getSession方法 发现客户端没有session对象,就会创建一个新的session对象
并且把session对象id以Cookie的形式发给客户端
客户端再次访问服务器端(severlet),发现他带了一个sessionid,就会查找对应的session对象
如何获得session对象 直接调用 request.getSession() 一定返回一个session对象,我们就可以直接使用
getSession()细节
第一次来,没有携带jsessionid ,就创建一个新的session
第二次来,携带jsessionid ,根据这个jsessionid去查找对应的session,如果找到就直接返回
携带jsessionid,根据这个jsessionid找不到对应的session,重新创建一个session并返回
12_使用session对象实现数据的共享
//获取session对象,如果客户端没有对应的session对象,则创建新的session对象并返回 HttpSession session = request.getSession(); //设置数据 session.setAttribute("username", "wangwu"); //获取数据 session.getAttribute("username"); //删除数据 session.removeAttribute("username");cookie --- 传输 --转码 session 存在服务器 不需要
一次会话的时候, 只需要登录一次,保证所有的页面都知道你登录
给一个标记
这个标记保存到哪里好
1,要求
实效性
安全
整个会话的页面都可以使用
存在session中
cookie 窃取
request 一次请求就没有
ServletContext每个人都有登录状态
13_使用session实现用户登陆(初始化数据)
用户类 User模拟数据库 UserDB
14_使用session实现用户登陆(页面实现)
LoginUIServlet 登录界面IndexUIServlet 首页
15_使用session实现用户登陆(核心功能实现)
用户登录功能(LoginServlet)共享用户登录状态的功能
//用户名和密码正确,登陆成功后将用户名添加到session对象中 HttpSession session = request.getSession(); session.setAttribute("username", username); //获取session对象 HttpSession session = request.getSession(); //获取用户的登陆状态 Object username = session.getAttribute("username")
16_使用session实现用户登陆(注销功能实现)
LogoutServlet 登出界面 //获取session对象 HttpSession session = request.getSession(); //删除数据,删除用户在session中的数据---不推荐 session.removeAttribute("username") //销毁session对象 session.invalidate();
17_session对象的生命周期
一个对象从创建到销毁的整个过程
时间:
创建: 第一次调用getSession()创建Cookie对象
销毁: 1,超时 默认30分钟(从最后一次请求算起)
2,手动调用invalidate()方法
3,非正常关闭服务器
钝化
当我们使用正确的方式关闭tomcat,tomcat会把session对象以及session对象所存储的数据持久化到tomcat的work目录下,以便tomcat再次启动的时候可以恢复这些数据