6.Cookie和Session
/*会话*/ (开一个浏览器,访问几个web资源,然后关闭浏览器,这个过程为一个对话)
/*保存*/会话数据的两种技术(cookie session)
1.Cookie (客户端技术)(数据保存在客户端中)
程序把每个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再去访问服务中的web资源时,就会带着各自的数据去,这样web资源处理的就是用户各自的数据了 2.session(服务器端技术(数据保存在服务器中)
服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其实web资源再从用户各自的session中取出数据为用户服务 /*cookie案例,显示用户上次访问网站的时间*/
//删除一个 cookie 设置maxAge为0
public class CookieDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { Cookie cookie = new Cookie("lastAcceptTime",System.currentTimeMillis()+"");
cookie.setMaxAge(0);
cookie.setPath("/day07");
response.addCookie(cookie); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }
//显示用户上次访问网站的时间
public class CookieDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
//pw.print("<a href = '/day07/servlet/CookieDemo2'>请求上次访问时间</a>");
pw.print("上次访问的时间为:"); //获得用户的时间cookie
Cookie cookies[] = request.getCookies();
for(int i=0; cookies!=null && i<cookies.length;i++) { //注意:这里的判断顺序不能写反,不然会有异常 (先判断是否为空,再去使用)
if (cookies[i].getName().equals("lastAcceptTime")) { //而且,不能这样判断 cookies[i]!=null (这样判断也是相当于先使用 后判断 ,不行)
long cookieValue = Long.parseLong(cookies[i].getValue()); //得到用户上次访问的时间
Date date = new Date(cookieValue);
pw.print(date.toLocaleString()); }
} //给用户回送当前最新的访问时间
Cookie cookie = new Cookie("lastAcceptTime",System.currentTimeMillis()+"");
cookie.setMaxAge(1*24*3600);
cookie.setPath("/day07");
response.addCookie(cookie); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} } /*Cookie细节*/ 1.一个cookie只能标识一种信息,它至少含有一个标识该信息的名称(name)和设置值(value) 2.一个web站点可以给一个web浏览器发送多个Cookie,一个web浏览器也可以存储多个web站点提供的cookie 3.浏览器一般只允它是一个会话级别的cookie(即存储在浏览器的内存中) 用户退出浏览器之后即被删除 允许存放300个cookie,每个站点最多存放20个cookie,每个cookie大小限制为4KB (为了性能考虑) 若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge并给出一个以秒为单位的时间,将这个时间设为0 则是命令该浏览器删除该cook 4.如果创建了一个cookie,并将它发送到浏览器,默认情况下, 5.注意:删除cookie时(过程:创建一个新cookie(与删除的一样),设置maxAge为0,设置path,(即该cookie除了maxAge不一样,其他全一样)发送给浏览器),path必须保持一致,否则不会删除 /*CookieDemo2*/
/*session对象*/
(生命周期:出生(第一次碰到getSession) 摧毁(关浏览器也不会死,session在服务器中,30分钟后无人使用后摧毁))
服务器是如何实现一个session为一个浏览器服务的?
session 实现原理:(其实 /*session工作基于cookie*/)
1.每个session创建的时候都有一个ID号,而这个ID号 以cookie的形式回写给浏览器,
2.浏览器下次来访问服务器,就会带着ID号过来,服务器就取出指定session为浏览器服务
(注意:这里回写的cookie是 /*没有设置有效期的*/,浏览器关了,cookie就没有了,下次访问,浏览器就不能用指定的session,服务器会创建一个新的session为浏览器服务)
(解决这个问题:创建session的时候,重新写一个cookie,并设置有效期,覆盖原来的, )
session的一些小细节:
1.如果用户把cookie给禁了,服务器给浏览器回送cookie的时候,浏览器就不要这个cookie了,就不能找到指定的session拿到数据,而是创建一个新的session(对127.0.0.1不阻止)
(解决办法:将sessionId重写到到URL中 )
(getSession方法执行过程,先看下有没有以cookie的方式带ID来,再看下有没有以超链接的方式带ID来),如果两个都没带过来,就创建新的session,否则,根据指定ID找到指定session)
2.如果没有禁cookie,同时将url重写了的时候,当服务器一旦发现浏览器可以接收cookie的时候,就不会执行重写的那个方法 encodeURL
3.通过url重写的方法,在浏览器关闭之后,并不能保存上次购买的东西,如 cookie没有设置有效期的时候出现的情况 (这个问题无法解决)
4.在一个浏览器中,有多个选项卡(多个窗口) ,因为是基于一个浏览器,所以用到的是同一个session .
使用session完成用户登录
1.在servlet1(登录)中,通过HTML中的表单,拿到 账号和 密码,然后进行判断 ,如果账号密码都符合,就向session中存储一个登录标记
request.getSession().setAttribute("user", username);
存储标记完成后,重定向到指定jsp,提示该用户成功登录 。 如果,账号密码不符合 ,打印相关提示信息
2.在servlet2(注销)中,通过 session.removeAttribute("user"); ,删除标记,即可完成注销,然后跳到指定jsp,提示相关信息
3.jsp中 有登录 和注销 超链接 可以完成登录 注销操作(jsp中 可以根据标记 拿到账户信息)
客户端防表单重复提交和服务器端session防表单重复提交
客户端防表单重复提交 (用JavaScript)(两种方式:1.提交一次后,后面的提交无效;2.点击一次提交按钮后,提交按钮失效)
服务器端session防表单重复提交:(一个servlet 产生表单(表单通过jsp产生(创建的之后需要隐藏存储在session中的随机数)))
1.表单通过程序打给浏览器,这个程序在给浏览器打印表单的时候,在每一个表单里面都带上一个随机数(唯一的ID号),并且这个随机数在服务器中,也会存储一份
2.浏览器收到这个表单,点击提交的时候,就会带着这个随机数过来
3.在服务器端,检测带过来的随机数在服务器端有没有,如果有的话,意味着这个随机数没有提交过,就让其顺利提交;
提交之后,马上把这个随机数从服务器中删除,下次浏览器再提交过来,带过来的随机数在服务器中并不存在,所以服务器就不让其提交
session实现验证码的校验 (三个文件)
1.一个jsp文件用于在浏览器显示表单,(用户名,密码,验证码(通过servlet1获取))
2.servlet1用于随机验证码的生成(除了给jsp,也要存储一份在session中)
3.servlet2用于检验验证码是否正确(拿到在session中的验证码 和 表单中用户敲的验证码) (注意字符编码问题)
/*三个域对象的总结*/ 何时用何种容器(request,ServletContext,session)
request域:数据显示完了就没用了,就采用request域作为容器 (请求结束,数据消失)
session域:数据显示完了,等一会还要使用 (如随机验证码,显示完了,还要用于检测)
ServletContext域:数据显示给用户看了之后,不仅等一会要用的,而且还要给别人用 (聊天室)
6.Cookie和Session的更多相关文章
- Cookie和Session的总结
1.开篇 在之前学习这一段的时候我一直有点没弄清楚,其实对Session这块的理解还可以,但是Cookie感觉始终还是欠缺点火候.之后的很长一段时间都基本上很少用Cookie了,渐渐的也淡忘了这一块的 ...
- java的会话管理:Cookie和Session
java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...
- Cookie和Session的那些事儿
Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能.Cookie是客户端(也就是浏览器端)的技术,设置了Cookie之后,每 ...
- django的cookie和session以及内置信号、缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
- Cookie和Session的区别
前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题.不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题 ...
- 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel
本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ...
- Cookie与Session
再说Cookie与Session之前,先要了解一下http协议. 何为http协议: http协议即超文本传输协议,一种基于浏览器请求与服务器响应的协议,该协议主要的特点就是它是一种无状态的协议(只针 ...
- 【转】Cookie和Session区别和联系详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 理解Cookie和Session机制(转)
目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...
- cookie 和session 的区别详解
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...
随机推荐
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_15-页面静态化-模板管理-模板管理业务流程
在视频教学的过程中,不会去做模板管理的模块 cms_template用来存储模板信息 cms_page 这一些课程页面用的是一个模板 模板的详情.templateFileId是模板的文件id 模板的文 ...
- Qt编写安防视频监控系统5-视频回放
一.前言 一般视频回放都会采用GB28181国标来处理,这样可以保证兼容国内各大厂家的NVR,毕竟在同一的国家标准下,大家都会统一支持国标的,就不需要根据各个厂家的SDK来做兼容处理,烦得很,厂家越来 ...
- springboot-springmvc-requestParam
springmvc请求方式 1.直接写在形参中:基本类型 @RequestMapping("/testRequestParam1") public ModelAndView tes ...
- 一个老程序员PHP程序员说的话(用来提醒自己)
我,一个老程序员,也是一个学生,把玩过甚多语言,大多不精.我既非名牌学校,也不是高学历,仅代表一部分比较蛋疼的人.接触PHP也是很早了,从04年的OFSTAR开始的,到现在六年了,期间也接触过不少的语 ...
- 【MOOC课程学习记录】程序设计与算法(一)C语言程序设计
课程结课了,把做的习题都记录一下,告诉自己多少学了点东西,也能给自己一点鼓励. ps:题目都在cxsjsxmooc.openjudge.cn上能看到,参考答案在差不多结课的时候也会在mooc上放出来. ...
- vulstudy
vulstudy是专门收集当下流行的漏洞学习平台,并将其制作成docker镜像,方便大家快速搭建环境,节省搭建时间,专注于的漏洞学习上.目前vulstudy包含以下漏洞学习平台: 序号 漏洞平台 包含 ...
- 【Qt开发】【Gstreamer开发】Qt error: glibconfig.h: No such file or directory #include
今天遇到一个问题如题 但是明明安装了 glib2.0和gtk,但是仍然找不到glibconfig.h,自己在/usr/include下找来也确实没有,然后只能在全盘搜啦 位置在: /usr/lib/x ...
- nginx http跳https配置
为了数据传输的安全性以及防止网页被恶意篡改,现在大多数网站都配置了https. 如何保证用户都是通过https进行访问呢? 如果有用到nginx,我们可以配置强制跳转. 在nginx配置中添加: se ...
- javascript当中类型转换,typeof的用法
1)类型转换,typeof的用法 例 3.1.1 <HTML><head> <meta http-equiv="content-type" co ...
- IO多路复用技术详解
IO多路复用:I/O是指网络I/O,多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程.意思说一个或一组线程处理多个TCP连接.最大优势是减少系统开销小,不必创建过 ...