day08sessioncookie笔记.docx
- 文档编号:10227642
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:21
- 大小:23.77KB
day08sessioncookie笔记.docx
《day08sessioncookie笔记.docx》由会员分享,可在线阅读,更多相关《day08sessioncookie笔记.docx(21页珍藏版)》请在冰豆网上搜索。
day08sessioncookie笔记
今日任务
1、Cookie技术
2、Seesion技术
3、JSP技术
课堂笔记
1、Cookie技术
Cookie技术主要解决的是在客户端和服务器进行交互的过程中,保存用户的数据,这些数据主要是通过服务器使用Cookie对象写到客户端的浏览器中。
然后在浏览器中保存这些数据。
Cookie对象可以保存用户和服务器的交互数据,但是需要保存在客户端。
1.1、Cookie分类
Cookie分成2类:
会话级别的Cookie:
客户端开发访问服务器,直接客户端的浏览器关闭,这个称为一次会话,在这个会话期间,服务端给客户端书写的Cookie数据,都会保存在客户端运行的浏览器的内存中。
当浏览器关闭流,浏览器所占的内存就清空了,导致在其中保存的Cookie数据也没有了。
用户如果再次打开浏览器访问服务器,那么上次的Cookie已经不存在,用户访问服务器的时候,是不会带着上次的Cookie信息到服务器。
持久化的Cookie:
持久化Cookie,就是把服务器给客户端写Cookie数据,长久的保存在浏览器的临时缓存的目录中。
当客户端把浏览器关闭了,但是Cookie已经保存在客户端的本地文件中,下次启动浏览器再次访问相同的网站时,浏览器就会自动带着Cookie到服务器。
让Cookie持久化,可以使用Cookie对象中的setMaxAge(时间);时间是以秒为单位
1.2、设置路径
在给客户端保存Cookie的时候,其实每个Cookie都有一个路径,如果我们没有设置这个路径,它会使用当前默认的路径,默认的路径就是项目的名称。
如果我们本地的浏览器缓存目录中有当前需要访问的某个网站的根路径所指的Cookie。
那么在访问当前这个网站的时候,浏览器会自动带着Cookie到访问的服务器中。
我们也可以手动的设置Cookie的有效路径:
setPath方法就可以设置路径。
使用setPath设置Cookie的有效路径的时候,一定要保证设置的路径是当前项目中的一个有效的路径,如果随意设置,在访问的时候,就不会携带这个Cookie。
真实开发的时候,需要设置路径时,一般使用”/”搞定,代表的是项目的根路径
1.3、Cookie的有效域名
Cookie还有域名的问题:
在设置Cookie的时候,不仅仅可以通过路径去设置有效的Cookie,同时还可以通过Cookie中的setDomain方法设置Cookie存在的有效域名。
如果设置的Cookie的有效域名和当前网站不符,我们把这个Cookie称为第三方Cookie,一般浏览器都会阻止第三方Cookie的保存。
1.4、删除Cookie
把Cookie有效时间设置成0,那么在浏览器退出的时候,Cookie会自动删除。
并且在设置的时候,或把Cookie的key对应的value值也设置“”
在情况Cookie的时候,需要保证情况Cookie时设置的路径和保存时设置的相同
1.5、Cookie案例(商品浏览记录)
这个练习:
1、创建JSP页面用于显示所有的商品和浏览器记录
id=1">电视机
id=2">洗衣机
id=3">笔记本
id=4">手机
id=5">空调
清空历史记录
您曾经浏览器过的商品是
<%
//假设所有的商品都保存在数组
String[]goods={"","电视机","洗衣机","笔记本","手机","空调"};
Cookie[]cookies=request.getCookies();
if(cookies!
=null){
for(Cookiec:
cookies){
if(c.getName().equals("goods")){
//获取Cookie中的值goods="1,2,3,4,5";
Stringvalues=c.getValue();
//使用空格切割
String[]ids=values.split(",");
if(ids!
=null&&ids.length>0){
//把用户曾经浏览过的商品显示在页面上
for(inti=0;i //获取商品id try{ intid=Integer.parseInt(ids[i]); StringgoodsName=goods[id]; out.println(goodsName); }catch(Exceptione){} } }else{ out.println("您还没有浏览器过任何商品"); } } } }else{ out.println("您还没有浏览器过任何商品"); } %> 2、创建Servlet程序用于获取用户浏览商品的信息,并且给客户端写Cookie,保存用户浏览的商品记录 /* *处理用户浏览器商品的记录信息 */ publicclassGoodsServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //用户点击商品,就会访问到当前这个Servlet程序 Stringid=request.getParameter("id"); //获取Cookie,如果用户是第一次浏览器商品, //就没有和商品对应的Cookie信息,如果用户不是第一次浏览器商品,那么就会携带者Cookie过来 Cookie[]cookies=request.getCookies(); Cookiecookie=findCookie(cookies,"goods"); //判断有没有和商品相关的Cookie if(cookie==null){ cookie=newCookie("goods",id); }else{ //获取原来Cookie的值 Stringold_id=cookie.getValue(); //判断获取的Cookie中的value值是否已经包含正在浏览器商品的id信息 if(! old_id.contains(id)){ cookie.setValue(old_id+","+id); } } //保存Cookie cookie.setPath("/"); cookie.setMaxAge(60*60*24); response.addCookie(cookie); //重定向到显示所有商品的页面 response.sendRedirect("/day08/all.jsp"); } privateCookiefindCookie(Cookie[]cookies,Stringkey){ //判断有没有Cookie对象 if(cookies==null){ returnnull; } for(Cookiec: cookies){ if(c.getName().equals(key)){ //获取都和商品记录相关的Cookie信息 returnc; } } //虽然用户带着Cookie过来,但不是和商品相关的Cookie returnnull; } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); } } 3、清空历史记录 /* *清空Cookie */ publicclassCookieServlet2extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //直接情况 Cookiec=newCookie("goods",""); //设置时间 c.setMaxAge(-1); //设置路径 c.setPath("/"); //写给客户端 response.addCookie(c); //重定向到显示所有商品的页面 response.sendRedirect("/day08/all.jsp"); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); } } 2、Session原理和案例 2.1、Session原理分析 Session: 会话技术,从客户端打开浏览器访问服务器,到最后客户端关闭浏览器,整个过程称为一次会话。 在这个会话的过程中,服务器会针对每个客户端创建一个和客户端相关的唯一的临时容器,这个容器用于保存当前客户的所有信息。 并且在给客户端响应数据的时候,会给客户端回送一个唯一标识当前客户端相关的临时容器的id,在客户端下次访问服务器的时候,会携带这个id信息,在服务器端就可以找到和客户端相关的临时戎,继续使用这个临时容器。 如果获取这个Session对象,为每个客户端服务: 可以通过Request对象获取和当前客户端相关的唯一Session对象。 /* *演示Session对象 * *在Request对象中getSession方法有2个 *getSession()在第一次调用的时候,如果服务器端没有针对当前这个客户端创建Session对象,那么调用 *这个方法的时候,服务器会自动创建一个Session对象,并且和当前这个客户端对应起来。 *如果真的这个客户端已经有一个Session对象存在,那么在getSession方法的时候,就会返回这个已经存在的Session对象 * *getSession(booleanboo) *在调用可以传递boolean值的getSession方法的时候,如果传递的false,这时只会去获取已经存在的Session *如果根本就没有Session对象这时,返回的就是null *如果传递的是true,获取Session对象的时候,如果没有Session就会创建,如果有,返回原始Session对象 * *服务器在获取和某个客户端相关的Session对象的时候,其实需要客户端给服务器发送一个Cookie,这个Cookie中必须有 *JSESSIONID=03825AE783B680E8B31925E6AEF24B22的数据。 在服务器端我们调用getSession的时候, *服务器内部就会根据JSESSIONID获取和客户端对应的唯一的Session对象,如果客户端没有携带JSESSIONID,那么 *服务器就会为这个客户端创建一个新的Session对象,然后给客户端回送一个Cookie,在Cookie中添加了JSESSIONID信息 * *每个一个Session对象它其实针对的不是一个用户,而是真的的用户使用的浏览器,只要打开浏览器访问服务器,需要使用Session的时候, *服务器就会根据当前用户的这个浏览器创建一个唯一的Session对象。 如果用户使用多个浏览器访问同一个服务器, *服务器会根据不同的浏览器创建出不同的Session对象。 * *Session对象是基于浏览器的,只要用户不关闭浏览器,那么针对这个浏览器的Session在服务器端就会一直存在, *不管用访问当前这个项目的那个程序,都可以去使用针对这个浏览器的Session对象。 * *一般我们使用Session主要保存和用户当前访问某个网站的一系列的操作信息。 *我们一般使用Session来保存用打开浏览器开发访问网站的一系列的操作, *然后在用户最后需要显示所有操作的时候,把Session中的所有数据取出即可 * *使用同一个Session对象,在多个servlet之间完成数据的共享 * * */ publicclassSessionServlet1extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //获取Session对象 HttpSessionsession=request.getSession(); Stringip=request.getRemoteAddr(); //使用Session完成数据的共享 session.setAttribute("addr","上海传智播客"+ip); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); } } 2.2、思考: 关闭浏览器后再次访问能获取到Session吗 Session是如何工作的? 当用户第一次访问某个Servlet程序的时候,在Servlet中我们调用request.getSession(),那么会得到和当前这个浏览器对应的Session对象,在使用response给客户端响应数据的时候,会把当前这个Session对象的jsessionid以Cookie的形式发送给客户端,当客户端再次访问服务器中的资源时,就会携带这个jsessionid数据,以Cookie的形式提交给服务器,在服务器中我们就可以根据用户携带的jsessionid获取和客户端浏览器对应的Session对象,为用户继续服务。 浏览器关闭后再次访问服务器,无法获取到前一次的Session对象。 因为我们在Servlet中获取到Session之后,如果没有认为的去书写Cookie对象,这时服务器会自动的给客户端回写Cookie,Cookie中保存的是当前针对这个浏览器的Session对象的jsessionid数据,而这个Cookie恰好是一个会话级别的Cookie,当用户关闭了浏览器之后,这个会话级别的Cookie就会自动的消失,当用再次访问服务器的时候,并不会携带上次的会话Cookie一次到服务器端,所以在服务器端拿不到的jsessionid信息,就无法获取和当前浏览器对应的那个Session对象。 虽然在服务器无法拿到上次的Session对象,但是这个Sessoin对象在服务器端依然存在。 但是有没有拿不到jsessionid,所以无法获取上次的Session对象。 要保证浏览器关闭之后还可以获取到上次的Session对象,这时就需要把Cookie持久化。 就需要在Servlet中手动的在Cookie中保存jsessionid的信息 publicclassSessionServlet1extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //获取Session对象 HttpSessionsession=request.getSession(); Stringip=request.getRemoteAddr(); //使用Session完成数据的共享 session.setAttribute("addr","上海传智播客"+ip); //把这个Session的id持久化,创建Cookie对象 Cookiec=newCookie("JSESSIONID",session.getId()); //持久化,设置时间 c.setMaxAge(60); //设置路径 c.setPath("/"); //添加Cookie response.addCookie(c); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); } } 2.3、Session案例(购物车) 网上购物的过程: 首先我们会访问某个电商网站,这时会浏览到所有的商品,浏览到自己感兴趣的商品时,我们一般点击加入购物车,加入购物车成功之后,还可以继续购物。 继续购物的时候,即就是用户在继续选择新的商品,当用户选择到了商品,点击加入购物车之后,会把当前的这个商品和以前的商品加入到同一个购物车中。 实现购物把商品加入到购物车中: 1、需要一个页面显示所有的商品
id=1">电视机
id=2">洗衣机
id=3">笔记本
id=4">手机
id=5">空调
2、书写用户点击某个商品,加入到购物车中的Servlet程序
/**
*把用户选择的商品加入到购物车中
*购物车的实现原理:
*首先在Servlet中需要创建一个Map集合,用户保存用户选择的商品,以及商品的数量
*在这个HashMap集合中保存用户选择的所有商品,以及商品的数量
*
*最后需要把这个Map集合保存到Session中,用户下次再点击商品的时候,我们就可以在Servlet中获取Session对象
*然后获取Map集合中,从Map集合中获取有没有用户正在点击的商品,如果有,就在原有的数量上+1,
*如果没有,说明用户是第一次选择这个商品。
把这个商品加入的Map集合中,数量就为1
*@author屈博
*@2014年12月19日下午2:
46:
44
*/
publicclassBuyServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//假设一个保存商品的容器
String[]goods={"","电视机","洗衣机","笔记本","手机","空调"};
//获取用户选择的商品的id信息
Stringid=request.getParameter("id");
//判断id
if(id!
=null){
intnumber=Integer.parseInt(id);
//获取Session对象
HttpSessionsession=request.getSession();
//从Session中获取Map集合
Map
//如果取出map为null就说明用户是第一次访问商品
if(map==null){
map=newHashMap
map.put(goods[number],1);
}else{
/*
*说明从Session中一定获取到Map集合,也说明用户不是第一次购买商品
*1、根据id,判断当前用户选择的商品在map集合中是否存在,如果存在对应的value值+1
*2、如果不存在,说明用户不是第一次购买商品,但是当前这个商品是第一次购买,
*就把这个商品的信息和数量保存到map中
*/
if(!
map.containsKey(goods[number])){
//判断成立说明用户购买这个商品是第一次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- day08sessioncookie 笔记