JavaWeb-会话cookie

定义:打开浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话

会话过程中要解决的问题: 保持各个客户端自己的数据(每个用户使用浏览器与服务器会话过程中,不可避免各自产生一些数据,服务器想办法为每个用户保存这些数据. 例如点击超链接通过一个servlet购买了一个商品,程序应该想办法保存购买的商品,以便于该用户点击结账servlet时,结账servlet可以得到用户购买的商品,为用户结账)

用户购买的商品存到request或者servletContext中行不行?(这俩都是域对象)

1.servlet是单实例,再来一个浏览器,会取出来前一个浏览器的购买商品(每个浏览器访问,共享一个servletContext)

2.如果是request,在servlet1购买是一次请求,在servlet2结账是另一次请求.第二次请求不能访问到第一次请求存在request中的数据!

保存会话数据的技术:

Cookie:客户端技术.程序把每个用户数据以cookie形式写给用户各自的浏览器,当用户使用浏览器去访问服务器中 web资源,就会带着各自的数据去.这样,web资源处理的就是用户各自的数据了

问题:当用户在购买时,为什么不添加一件商品到购物车,就连接数据库修改该用户对应的购物车呢?是不是每个用户每个行为都连接数据库处理,成本远大于cookie传播数据这种技术?

 

Session是服务端技术,服务器为每个用户浏览器创建一个独享的HttpSession对象,由于session为哟ing胡浏览器独享,故用户可在访问web资源时把各自的数据放在各自的session中,当用户访问服务器中其他web资源时,其他web资源再从用户各自的session中取出数据,为用户服务

 

cookieAPI:

response接口中定义了一个addCookie方法,用于在响应头中增加一个相应的Set-Cookie头字段. 同样,request接口中也定义了一个getCookies方法,用于获取客户端提交的Cookie.(Cookie是客户端技术,是浏览器自己到处带着的. 是servlet发送到浏览器的少量信息.由浏览器保存并将发送回服务器. cookie的值可以唯一标志客户端,常用于会话管理)

一个cookie含有一个名称一个值,以及一些可选属性,比如注释/路径和域限定符/最大生存时间和版本号. 一些web浏览器在处理可选属性方面存在bug,因此有节制使用这些属性可提高servlet的互操作性.

 

练习:访问界面,得出上次访问时间

保存数据到cookie-获取cookie里面上次访问时间,顺序问题:一上来应该先获取上次访问时间,再把目前的时间保存进去

 

一个cookie只能标志一种信息,至少含有一个标志该信息的名称(name)和值value

一个web站点可以给一个浏览器发送多个cookie. 一个浏览器也可以存储多个这样的cookie. 一般最多允许存放300个,每个大小限制4KB,每个站点最多存放20个Cookie.默认的是会话级别的cookie,退出浏览器后就没了

 

路径问题:默认值是写Cookie的那个程序的访问路径,比如/day10_cookie/servlet/. 以cookie的path开头的路径被访问,那么浏览器就带cookie,否则不带

创建cookie的路径下的资源都能访问到这个cookie

可以通过.setPath方法设置cookie的路径

    ck.setPath("/"); 服务器端代码,代表当前应用的目录名称,跟下面那行一样效果

    ck.setPath("/day10_cookie")

删除那里搞不懂,我把它置1了,关闭浏览器了,下次进去还是显示日期. 直接用源码也不行

有时候就在同一个标签页,clear一下,然后重新输入网址就发现cookie被删除了.

但是不是要打开至少别的标签或者浏览器新窗口才算一个新的会话吗?

ie也是如此,同一个标签,地址栏复制上ck1的地址然后回车就发现cookie已经被清除了.不是说这种要关闭会话才生效吗?难道在地址栏输入新地址,就代表这个会话结束?

 

note:自己设置各种无效,发现是cookie的path没设置好,如果一个clear的servlet代码有ck.setPath("/");,那么另一个代码(ck1)也需要ck.setPath("/"); 你清除的cookie代码的路径,和你当时设置的cookie路径,要注意检查是不是设置为同一个或者都是默认的了!

(当我把clear的这句代码注释,变为两边都是默认,又恢复正常可以清除cookie了)(地址栏复制ck1就能看到效果的那种清除)

 

servlet负责的工作内容:1.获取表单数据 2.处理业务逻辑 3. 分发转向

 

例:记住用户名:根据cookie的有效时间来做.依旧是一个login的servlet,一个doLogin的servlet,前者画网页接收输入,后者处理上面说到的三点. 通过控制cookie的存活时间来控制用户名保存多久

例子 实现显示商品浏览记录

1. 一个个商品是对象(名称,单价,参数等信息),而cookie只适合存字符串且只能存少量信息.

解决方法 :把商品ID 存到cookie中,到数据库去查询这个不重复的主键. 再拿出来显示 

2.还有个问题,存很多个cookie,name都是productID(仅仅是value=ID不同),cookie将被频繁覆盖(name名称一样,path路径一样,只能覆盖咯)

解决方法:  将各个ID拼接起来,再往cookie里存; 取出来用的时候再切割一下就ok

1.仿造数据库功能的代码

2.首页的代码

2.1 固定内容:从数据库读取所有书并显示出来

2.2 浏览历史 根据cookie里的内容,分割后显示出来历史

3.页面3详情页,进入这里就要负责更新cookie,根据各种情况(数量,是否已存在历史列表等等)维护cookie

其中负责组织出id来维护cookie的organizeId函数代码:

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值