Cookie和session学习要点



一、

Cookie
 response.addCookie(cookie);
 request.getCookies()
 
 Cookie(String name, String value) ,cookie只有这么一个构造方法,在创建出来时就应该立即指定cookie 的名称,和cookie 的值
 setValue与getValue方法  重新设置cookie 的值,获取cookie 的值
 getName方法 获取cookie 的名字,没有setName方法,一个cookie一旦在创建时设定了一个名称,则此cookie 的名称是不能修改的。
 setMaxAge与getMaxAge方法  如果一个cookie信息没有设置过maxage,则此cookie 被发送到浏览器后,将被保存在浏览器的内存当中,随着浏览器的关闭cookie会消失。也可以设置MaxAge的值,是以秒为单位的值,通知浏览器将cookie信息保存多长时间,只要设置过maxage,浏览器将会把cookie信息保存在浏览器的临时文件夹中,保存指定的时间,多个浏览器都可以看见此cookie。如果将maxAge设置为0,或负数,则是通知浏览器去删除同名的Cookie
 setPath与getPath方法:此方法通知浏览器在访问哪个路径及其子路径时,带回当前的cookie信息。如果一个cookie不设置setPath,浏览器默认使用发送当前cookie的Servlet的所在的路径做为path
 setDomain与getDomain方法:此方法用来通知浏览器在访问哪个域名时带着当前cookie ,注意:只要cookie设置过domain,无论你设置的是什么值,浏览器都认为是第三方cookie,拒绝接受。

 
Session
 域对象
 生命周期:当第一次调用request.getSession()方法时创建出对应当前浏览器的session对象。当一个session对象超过一定的时间(默认值30分钟,可以在web.xml文件中为整个web应用配置session过期时间)没有人使用,服务器认为该session已经超时,销毁该session。可以调用session对象身上的invalidate方法,直接销毁该对象。当服务器非正常关闭时,session跟着销毁。服务器正常关闭,服务器会将没有超时的session以文件的形式保存在work目录下,这个过程叫做session的钝化。当下次服务器正常启动时,会从此文件中加载会之前钝化的session信息,这个过程叫做session 的活化。
 作用范围:整个会话范围内
 
Session原理,利用Session原理实现同一台计算机中多个浏览器公用一个session

 
URL重写操作

 response.encodeURL()
 response.encodeRedirectURL();这两个方法特别的智能,他在进行url重写之前会检查一下浏览器是否带了任意cookie回来,如果发现浏览器带过任意的cookie则认为浏览器没有禁用cookie,url重写操作将不会进行。

 request.getSession():1.检查请求中是否有JSESSIONID cookie信息,如果有根据session id找到对应的session返回。 2.如果找不到JSESSIONID cookie,则检查请求发送过来时URL中是否包含JSESSIONID这样的特殊属性,如果有这个特殊属性,这用该属性的值,找对应的session。 3。如果前两步骤都找不到对应session则服务器认为是一个新访问的浏览器为其创建新的session,并将session
 的id 生成一个JSESSIONID cookie 返写个浏览器。
 
 
 
  浏览器将cookie禁用:
   URL重写操作,将发送给浏览器的所有的超链接都进行URL重写操作,在所有的URL后面拼上特殊的属性JSESSIONID,如此一来,即使用户禁用了cookie,在访问超链接时,通过URL也能带回JSESSIONID信息。


二、


1.会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话。
2.问题:如何在一次会话中保存会话相关的数据。
3.Cookie:将会话相关的数据保存到浏览器中,并且在每次访问服务器时都带过去。
 3.1javax.servlet.http.Cookie,可以直接利用此类的构造方法创建一个Cookie,创建出来的Cookie需要设置一个名称和值
 3.2response身上具有addCookie的方法,可以将创建出来的组织成响应消息中的set-cookie头,通知浏览器保存该cookie
 3.3request身上具有getCookies方法,可以获取浏览器带过来的所有Cookie
 3.4Cookie方法:注意,浏览器是根据cookie的名称加上cookie的path来区分是否是同一个cookie的,如果需要覆盖之前的cookie,除了保证名称相同外还要保证path也相同。
   public Cookie(String name,String value)利用构造方法创建一个Cookie对象,在创建的时候就要指定该Cookie的名和值
   setValue与getValue方法  设置或者获取Cookie的值
   setMaxAge与getMaxAge方法  如果不设置cookie的MaxAge(或将其值设置为负值),则默认情况下浏览器会将cookie保存在浏览器的内存中,会随着浏览器关闭而消失。如果设置为一个正值,则代表该Cookie要保存的以秒为单位的时间值,如此,该cookie将会被浏览器保存到硬盘中去。如果将MaxAge设置为0,则是通知浏览器去删除该Cookie。
   setPath与getPath方法   用来指定访问哪个ULR及其子URL时带上此cookie,如果不设置此值,则浏览器默认会将发送该cookie的servlet所在的路径作为path使用。
    例如:
      setPath("/Day06")则/Day06/.../...的路径都会带上该Cookie
      如果发送该Cookie的Servlet是 /Day06/servlet/Demo1Servlet,并且未设置setPat,则浏览器在访问/Day06/servlet/..时会带上该cookie
   setDomain与getDomain方法  设置cookie对应的域名,此方法一旦调用,则浏览器会认为该cookie是一个第三方cookie而拒收
   getName方法 获取该cookie的名字,注意没有setName方法,一个Cookie一旦创建出来就不能修改名字了
   
 3.5浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
 
 实验: 利用cookie实现显示上次访问时间
   !~~利用cookie显示最近浏览的商品
4.HttpSession:在服务器中,为浏览器创建独一无二的内存空间,在其中保存会话相关的信息。
 4.1session作为域使用:他是j2ee中四大域对象之一,作用范围为整个会话。
 4.2session的生命周期:在第一次调用reqeust.getSession()方法的时候,服务器会检查是已经有对应的session,如果没有就在内存中创建一个session并返回。
            当一段时间内session没有被使用,一般为30分钟(此值可以在web.xml中配置<session-config>来配置,也可以使用TomcatManager进行配置),则服务器会销毁该session
            当服务器强行关闭时,没有到期的session也会跟着销毁。
            如果调用session提供的invalidate(),可以立即销毁session。
 4.3session的原理:在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。
 4.4同一电脑内的不同浏览器使用同一session:JSESSIONID这个cookie默认是保存在浏览器内存中的,我们可以自己创建一个同名同path的Cookie,并设置maxage值,使其被保存在硬盘中,从而实现统一电脑中不同浏览器公用一个JSESSIONID从而使用同一个session。
 4.5使禁用Cookie的浏览器也可以使用session:由于session是基于cookie运行的,如果禁用了cookie则会导致session不可用,我们可以将提供给这种浏览器的所有的URL进行重写,在所有的URL后跟上JSEESIONID,从而保证即使禁用了Cookie也能以URL的形式带回JSESSIONID,从而可以使用session。要重写所有的URL是一项成本很高的工作,一般我们不会这么做。
  response. encodeRedirectURL(java.lang.String?url)如果此url是作为重定向操作的地址时使用此方法
  response. encodeURL(java.lang.String?url)如果此url是普通连接则使用此方法
  实验:利用session实现简单的购物功能,并提供对同一台电脑上的多个浏览器共享session的支持以及对禁用cookie浏览器的支持。
  实验:使用Session完成用户登陆:当用户登录时在session中保存用户名,在其他页面就可以检查session中是否存在用户名,如果存在则认为已经登录过。注销的过程就是将session杀死的过程。
  实验:使用session完成防止表单重复提交:当提供表单页面时,在表单中隐藏一个随机数值,并且将该随机数保存到session中,当表单提交时,检查提交上来到随机数与session中的随机数是否相同,如果相同则允许注册,注册后立即删除session中的随机数,如果不同则认为是表单的重复提交。
 ??作业:利用session实现一次性验证码.
  *request.getSession()和request.getSession(false);的不同之处:前面的方法一调用,就会去检查是否有对应的session,没有就创建,有就取回。后面的方法只会去检查,如果有就取回,如果没有也不创建。
  
5.ServeltContext 、reqeust、session域的比较
 servletContext 的作用域是整个web应用,随着服务器启动而创建,如果应用被移除出主机或服务器关闭则销毁。
 request 的作用域是整个请求链,每一次请求都会创建一个request,当请求结束时request销毁。
 session 的作用于是整个会话,第一次调用reqeust.getSession时创建,当一段时间没有使用或服务器关闭或调用session.invalidate方法时销毁
 
 
 什么时候用ServeltContext什么时候用reqeust什么时候用session?
 如果一个数据只是用来显示的话就用request域
 如果一个数据除了用来显示以外我一会还要用,这时候用session
 如果一个数据除了用来显示以外还要给别人用,这时候用ServletContext域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值