目的:
为了保证在网络交互过程中保存一些临时产生的数据
会话:
当你去访问某个网站的时候,打开网站 我们称会话开始了,关闭浏览器我们称会话结束了
保存数据在浏览器端的
小甜点 小饼干
当咱们浏览器访问服务器的时候,除了正常业务逻辑之外,服务器可以让我们编程决定准备一个键值对数据(key,value) cookie对象
这时候在正常业务逻辑返回的时候,顺便带上cookie对象(底层通过 set-cookie的响应头来做)
返回浏览器内容,浏览器正常解析,除此之外,还会将偷偷返回的cookie 保存下来,
接下来,再次访问服务器的时候,浏览器会根据一定规则 自动偷偷的把cookie带上,(底层通过一个cookie的请求头做到),
request向服务器端获取cookie 提供好方法 直接获取
1)创建cookie对象
cookie cookie=new cookie("名字","值");
2)响应头带上cookie
response.addCookie(cookie)
3)获取cookie
cookie[] cookie=request.getCookies();
4)cookie自己方法
getName();//获取cookie的名字
getValue();//获取cookie的值
5)cookie的有效期级别:
会话级别:浏览器关了 浏览器销毁了 ,cookie就没有了;
持久化级别:
setMaxAge(int 秒值)
正数:写多少存多少秒
0: 立即删除该cookie 同名同路径
负数:表示会话级别
setPath("路径:");给你当前cookie设置一个路径,在下一次发送请求的时候,我们的浏览器会检查 cookie的路径 是否包含此次请求的路径;
默认情况下,路径为当前请求路径的父目录
例子:
请求 /day1101/xx/yy/zz 服务器返回cookie 没有设置path
cookie的path为 /day1101/xx/yy/,此路径下都可以应用cookie;(此处path说的是 urlPatterns ="/cookie/path")
接下来访问服务器的时候,
/day1101/xx/yy/ww
/day1101/xx/yy/ww/xx/asdas
以上这些 都可以带上
如果这些:
/day1101/xx
/day1101/aa/bb/cc
主动调用方法设置cookie路径:(设置路径后,怎么取出该cookie?)
path路径写法 以/打头 跟上项目名 后面自定义
一般使用 都是要求大家设置为项目名 一般都是整个项目都有效的意思
1).cookie 数据大小不要超过4kb
2).cookie 不支持中文 建议不要用中文
3).cookie不能跨浏览器
4).cookie规范:
要求浏览器产商 每一个网站最多给浏览器设置20个cookie 浏览器最多保存300个cookie
会话技术服务器端技术
7.1..session工作机制
当你去访问服务器的时候,服务器内部会去检查你是否携带了一个名字叫做 JSESSIONID 的 cookie --> Cookie("JSESSIONID",随机字符串);
7.1.1.第一次访问服务器:
没有带:
服务器中 可以调用api 为你开辟一块内存空间 底层 new Session()对象
紧接着调用方法 随机生成一个唯一的字符串(32位?) ,
将刚刚创建好的session对象跟字符串 映射起来 (术语叫做放入session池)
相当于放入到了一个map集合中
{
随机字符串1:session对象1,
随机字符串2:session对象2,
随机字符串3:session对象3,
随机字符串4:session对象4,
......
},
紧接着 随机的字符串会被 包装成一个cookie --> new Cookie("JSESSIONID",随机字符串);
并且cookie的path为项目路径 age是-1 ----> 此cookie以后不管项目任何资源都可以调用,并且是会话级别的;
随着响应带回cookie给浏览器,浏览器将此cookie保存;
7.1.2.第二次访问服务器:
带着呢:
服务器可以取出cookie的随机字符串,拿着随机字符串去session池中 取出对应的session对象;
你想要对自己session做什么 自己决定
7.1.3.如果您被劫持了呢?(与session对应的随机数丢失)
随机字符串去session池中有可能 也会查找不到
若查不到,服务器重新开始 第一个过程:
服务器中 可以调用api 为你开辟一块内存空间 底层 new Session()对象
紧接着调用方法 随机生成一个字符串 32位 ,
将刚刚创建好的session对象跟字符串 映射起来 (术语叫做放入session池)
相当于放入到了一个map集合中
{
随机字符串1:session对象1,
随机字符串2:session对象2,
随机字符串3:session对象3,
随机字符串4:session对象4,
......
},
紧接着 随机的字符串会被 包装成一个cookie new Cookie("JSESSIONID",随机字符串)
并且cookie的path为项目路径 age是-1 ---->cookie以后不管项目任何资源都可以 并且会话级别的
随着响应带回给浏览器
7.2..session的api:
1).创建session
//第一次创建
Httpsession session = request.getSession()
2).获取seesion
//第二次是获取
Httpsession session = request.getSession()
3).session提供方法是(属性)
value = getAttribute("name值")
setAttribute("name值","value值")
removeAttribute("name值")
session特性:
存储是私有的,session池存储在服务器.
1).创建:
Httpsession session = request.getSession()
2).销毁:
2.1.超时销毁
tomcat而言 默认是30分钟
选择性遗忘方法 可以做
setMaxInactiveInterval(int interval)
2.2.手动销毁
invalidate()//立即杀死session--------------------->重要
2.3.正常关闭服务器
服务器会将还没有到期的session进行钝化
下次启动的时候 我们称之为 活化
2.4.非正常关闭服务器 卡死了 断电了
3).session它存在时间多久 -----> 会话级别的(浏览器关闭即销毁cookie)
4).当有请求时候,创建session对象;当到时或浏览器关闭(cookie是会话级别,关闭浏览器则丢失此cookie)时候,销毁.
//////////////////////////////////////////////////////////////////////////
需求:
访问登录页面,填入账号密码 验证码,提交表单
如果不输入验证或验证码为空格:
在页面提示 验证码必须输入
如果输入 验证是否正确
错误:
在页面提示 验证码错误重新输入
正确:
下一步验证账号密码
错误了:
提示账号密码错误
正确了:
登录成功,跳转首页 在首页显示当前登录人名字
1.复制原来的项目(包含页面/登陆/注册/查询用户/验证码产生)
--各类中会出现一些错误,重新导入包或类就行
2.复制CodeSevrlet(验证码产生Servlet);
1).登录页面 改造验证码(2处)-->
--img标签改为点击(刷新)会变化的验证码(src="http://localhost/code"),
--验证码input输入框起名字(提交表单),
2).在CodeServlet 中将产生的字符串验证码-->存入session中;
--request.getSession().setAttribute("标识名","验证码内容msg");
3.提交表单,指向loginServlet,改造loginServlet,增加验证码逻辑判断:
1).验证码(null或空格)逻辑判断;
--页面错误提示:创建login.jsp,login.html中的登陆链接也改位login.jsp;
--loginservlet中获取session,设置属性-->jsp页面显示验证码错误信息
--重定向给login.jsp页面,用session获取要显示的错误信息(没获取到展示null),并展示出来
2).验证码错误逻辑判断:
--错误则重定向给login.jsp(同上),
3).账号密码逻辑判断;
--错误则重定向给login.jsp(同上)
--成功,重定向到首页index.jsp-->首页标识登陆状态,将当前登陆的对象放入session中
4).index.jsp页面,获取session,获取标识user对象,判断是否登陆成功:
--成功,显示"xxx欢迎您"
--未登陆,不显示.
5).退出登陆
--把退出登陆,指向loginoutServlet,创建LoginoutServlet类
--把session销毁,重定向到首页index
6).浏览器回退问题(没有发请求,只是从浏览器内存中获取了验证码,验证码将无意义)
--让验证码只能用一次-->在loginservlet中,用完即删除验证码信息的session
--if(session==null),重定向login.jsp-->"验证码只能使用一次"
7).验证码看不清,单击图片更换验证码
cookie的产生原理/工作原理/生命周期;
session的产生原理/工作原理/生命周期;
登陆/注册/查询用户/验证码产生 案例中,各种细节注意事项,需要考虑非常全面(思维???);
1.表单提交的信息,在request请求体中存储,用request.getParameter("name值")获取;
2.session.setAttribute("msg","验证码不可为空"); 储存在响应头