JavaWeb--浅谈Httpsession和cookie

       计算机领域知识错综复杂,并且不断更新。当我们不能理解原理时,先用一用再说,代码量上去了,然后再看原理就很easy。由于知识很多,所以我们学习的时候要尽量高效,一个新的知识,我往往是分三步来进行的,是什么,用途,怎么用。简单粗暴,往往能达到事半功倍的效果,我们不能理解时,一定不能钻牛角尖,先用它,用多了自然就会理解的。下面谈谈我对cookie和session的理解。

cookie是什么?

       cookie是Http协议制定的,不仅可以在jsp中使用,只要和Http相关,在其它后台语言中也可使用。当用户访问服务器时,它是由服务器创建(包含用户的相关信息),然后保存到(浏览器)客户端,客户端并不对其进行操作,只是简单的作为cookie的“仓库”。当同一个用户(可以理解为同一个机器,并且是同一个浏览器,因为cookie不能跨浏览器,浏览器的之间的内存是互相屏蔽的,而且每个浏览器在磁盘上的位置也不相同)再次请求相同的服务器下的某个路径时,若该路径包含了某个cookie的路径,就把该cookie带给服务器,然后服务器端对其进行操作,把上次保存的信息取出来,进行显示,让用户可以“接着”上次来进行访问。因为Http协议是无状态协议,无法追踪用户的状态信息。而cookie就实现了对用户的追踪技术,使用户更加方便,让用户的体验效果更好。其压力在客户端,不可能无穷尽的让服务器一直向浏览器保存cookie,内存和磁盘都承受不住。当然每个服务器可以向浏览器保存的cookie的大小和数量都有限制。

cookie的用途
  • 上次登录账号的保存
  • 曾经浏览的信息,足迹,像淘宝就有这个功能
  • 跟踪客户端的状态
  • ………
cookie的用法

       相信大家对Http协议都不陌生,在Http协议中,包含请求协议和响应协议,而cookie在协议中以头的形式存在。在响应协议中是Set-Cookie头,并且是一个头对应一个cookie,但有多个Set-Cookie头,而每个cookie又是以键值对的形式展现,一键一值。在请求协议中是Cookie头,并且只有一个,每个cookie以键值对展现,每个cookie之间用分号间隔。

       当然在JavaWeb中也可以通过response来发送Set-Cookie响应头,使用request来获取Cookie的请求头。但这太过于繁琐,不能更好的体现面向对象的特点,因此专门把这两个功能封装成两个方法:

  • response.addCookie()向浏览器保存cookie
  • request.getCookies()来获取cookie
获取之后再根据自己的需求对这些保存在cookie里的信息进行处理,是显示在哪里,还是对其进行校验…….

cookie知识的补充

       cookie在Java中同样也是一个类,当然它不止有name和value两个属性,还有一个很重要的属性就是maxAge。cookie的最大生命,即可以保存在浏览器的最大时长。

maxAge的设置效果:


  • maxAge>0:浏览器会把cookie保存到客户机的硬盘上,具体时长由maxAge设置的时长来决定(以s为单位)
  • maxAge<0:浏览器会把cookie保存到该进程的内存上,浏览器关闭,cookie失效
  • maxAge=0:浏览器直接删除这个cookie

       浏览器不可能每次把所有服务器向它保存的cookie带给本次所请求的服务,会对其进行筛选,由cookie的路径决定,cookie的路径是服务器在创建时设置的,并不是浏览器保存cookie的路径。浏览器访问服务器的路径,若包含某个cookie的路径,那么就会归还这个cookie到服务器。

Httpsession

Httpsession是什么?

       Httpsession是JavaWeb提供的,用来进行会话跟踪的类,session是服务器的对象,保存在服务器端。会话就是一个客户端对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器。服务器会为每个客户端创建一个session对象,session就像客户端在服务器端的账户,它们被服务器保存到Map中,这个Map称为session缓存。session的底层实现依赖cookie或者URL重写,其目的都是向服务器传递sessionId这个参数,方便服务器查找是否存在与之对应的session,若不存在,则创建session,并设置sessionId将其保存到cookie中。session是Servlet的三大域对象之一,它的作用范围是锁定一个用户,从打开浏览器到关闭,相关信息都保存在同一个session中,(往往包含了n个请求),简而言之,一个会话一个session。与request不同,request虽然也是域对象,但其不能跨请求的,在一个请求链中(在宏观上也只是一个请求)往往会跨多个Servlet,恰好Servlet之间通过request这个域对象共享数据,一个请求一个request。

Httpsession用途


  • session会话的多次请求中共享数据
  • 保存用户的登录信息,对相关页面进行拦截
  • ………..

Httpsession用法

作为域对象,那么域对象的通用方法它肯定是有的:


  • void setAttribute()
  • object getAttribute()
  • void removeAttribute()

接下来就是在Servlet和jsp中获取session,在jsp中,session是九大内置对象之一,所以不需要创建便可直接使用,这个在jsp生成的.java文件中可以清楚的看到(也可以参考下篇——对于jsp和Servlet的理解)。在Servlet中获取session是通过request.getSession()获取的。

Httpsession原理

       它的原理和银行卡,及银行后台对账户的处理原理很类似(一个老师讲的,感觉容易理解)我们知道,我们去办卡的时候,往往会在银行创建一个账户(并不是你的卡号),我们的money是存在账户里,并不是存在卡里,而卡号的作用就相当于一个ID和你的账户对应,卡号就存到卡里面。当我们去办理业务的时候,把卡号交给银行后台的服务器,然后匹配账号,再对账号里面保存的数据进行操作。同样的,我们来看session,前面已经提到session的底层实现依赖于cookie,session就相当于一个银行账户,卡号就相当于sessionId,而卡就是cookie。当我们服务器创建了一个session之后,浏览器会得到一个包含sessionId 的cookie,并且这个cookie的生命为-1,即只在浏览器的内存中存在,关闭了浏览器,那么该cookie就不存在了,所以session在关闭了浏览器之后就无效了。无论是在jsp中还是Servlet中,session都是通过request.getSession()方法来进行原理实现的。只不过在jsp中,session是内置对象,所以就直接存在啦,但在Servlet中,如果没有调用request.getSession()方法,session是不会被创建的。下面是request.getSession()这个方法的调用过程:


  • 获取sessionId
  • 当sessionId不存在的时候,创建session,并将sessionId保存到cookie中。
  • 当sessionId存在时,但在服务器端查找不到session时,服务器端重新创建session,并将新的sessionId保存到cookie中。
  • 当sessionId存在并且在服务器中能找到对应的session,那么就不创建session。
  • 返回session。

Httpsession知识补充

其它几个方法:

  • String getId()获取sessionId
  • int getMaxInactiveIntevar()获取最长不活动时间
  • void invalidate()让session失效 eg:可以实现账号退出的功能
  • Boolean isNew()查看session是不是新的。
  • 可以在web.xml中配置最长不活动时间,在session-config标签内配置session-timeout。
  •        URL重写,它的作用是在浏览器把cookie禁止的情况下,充当cookie的作用,无论是cookie还是URL重写都是向服务器传递sessionId这个参数。而URL重写是让网页中的所有的表单和超链接后面都加一个特殊的请求参数,即sessionId,具体的实现是:respond.encodeURL(String url),这个方法比较智能,当请求中没有归还sessionId的cookie时,该方法重写URL,否则不重写,当然URL必须是指向本站的url。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值