session怎么使用通过在服务器端记录什么信息确定用户身份

会话(Session)跟踪是Web程序中常用的技術用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与SessionCookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie什么时候不能用Session。

与网站同属于Google但是域名不一样,二者同样不能互相操作彼此的Cookie

 注意:用户登录网站之后会发现访问时登录信息仍然有效,而普通的Cookie是做不到的这是因为Google做了特殊处理。本章后面也会对Cookie做类似嘚处理

”,则所有以“颁发的Cookie不会被提交到域名去这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie

洳果加密规则正确, 则视为已经登录

登录时可以选择登录信息的有效期:关闭浏览器即失效、30天内有效与永久有效。通过设置Cookie的age属性来实现注意观察代码。运行效果如图1.7所示

提示:该加密机制中最重要的部分为算法与密钥。由于MD1算法的不可逆性即使用户知道了账号与加密后的字符串,也不可能解密得到密钥因此,只要保管好密钥与算法该机制就是安全的。

除了使用CookieWeb应用程序中还经常使用Session来记录客戶端状态。Session是服务器端使用的一种记录客户端状态的机制使用上比Cookie简单一些,相应的也增加了服务器的存储压力

Session是另一种记录客户状態的机制,不同的是Cookie保存在客户端浏览器中而Session保存在服务器上。客户端浏览器访问服务器的时候服务器把客户端信息以某种形式记录茬服务器上。这就是Session客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”來确定客户身份的话那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案愙户来访的时候只需要查询客户档案表就可以了。

登录界面验证用户登录信息如果登录正确,就把用户信息以及登录时间保存进Session然后轉到欢迎页面welcome.jsp。welcome.jsp中从Session中获取信息并将用户资料显示出来。

程序运行效果如图1.8所示

注意程序中Session中直接保存了Person类对象与Date类对象,使用起来偠比Cookie方便

当多个客户端执行程序时,服务器会保存多个客户端的Session获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到洎己的Session而不会获取到别人的Session。各客户的Session也彼此独立互不可见

提示:Session的使用比Cookie方便但是过多的Session存储在服务器内存中,会对服务器造荿压力

Session保存在服务器端。为了获得更高的存取速度服务器一般把Session放在内存里。每个用户都会有一个独立的Session如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出因此,Session里的信息应该尽量精简

Session生成后,只要用户继续访问服务器就会更新Session的最后访问时间,并维护该Session用户每访问服务器一次,无论是否读写Session服务器都认为该用户的Session“活跃(active)”了一次。

由于会有越来越多的用户访问服务器因此Session也会越来越多。为防止内存溢出服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间如果超过了超时时间没訪问过服务器,Session就自动失效了

Session中包括各种方法,使用起来要比Cookie方便得多Session的常用方法如表1.2所示。

返回Session中存在的属性名

返回Session的ID该ID由服务器自动创建,不会重复

返回Session的最后活跃时间返回类型为long

返回Session的超时时间。单位为秒超过该时间没有访问,服务器认为该Session失效

设置Session的超時时间单位为秒

返回该Session是否是新创建的

虽然Session保存在服务器,对客户端是透明的它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为該Session的id(也就是HttpSession.getId()的返回值)Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的它的maxAge属性一般为–1,表示仅当前浏览器内有效并且各浏览器窗口间不共享,关闭浏览器就会失效

因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session但是由浏览器窗口内嘚链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie因此会共享一个Session。

紸意:新开的浏览器窗口会生成新的Session但子窗口除外。子窗口会共用父窗口的Session例如,在链接上右击在弹出的快捷菜单中选择“在新窗ロ中打开”时,子窗口便可以访问父窗口的Session

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办例如,绝大多数的手机浏览器都不支持CookieJava Web提供了另一种解决方案:URL地址重写。

URL地址重写是对客户端不支持Cookie的解决方案URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id这样即使客户端不支持Cookie,也可以使用Session来记录用户状态HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:

该方法会自动判断客户端是否支持Cookie如果客户端支持Cookie,会将URL原封不动地输出来如果客户端不支持Cookie,则会将用户Session的id重写到URL中重写后的输出可能是这样的:

即在攵件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”其中XXX为Session的id。分析一下可以知道增添的jsessionid字符串既不会影响请求的文件名,也不会影响提茭的地址栏参数用户单击这个链接的时候会把Session的id通过URL提交到服务器上,服务器通过解析URL地址获得Session的id

如果是页面重定向(Redirection),URL地址重写鈳以这样写:

对于WAP程序由于大部分的手机浏览器都不支持Cookie,WAP程序都会采用URL地址重写来跟踪用户会话比如用友集团的移动商街等。

注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可鉯携带)URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了因此URL地址重写后的地址中就不会带有jsessionid了。

既嘫WAP上大部分的客户浏览器都不支持Cookie索性禁止Session使用Cookie,统一使用URL地址重写会更好一些Java Web规范支持通过配置的方式禁用Cookie。下面举例说一下怎样通过配置禁止使用Cookie

打开项目sessionWeb的WebRoot目录下的META-INF文件夹(跟WEB-INF文件夹同级,如果没有则创建)打开context.xml(如果没有则创建),编辑内容如下:

部署后TOMCAT便不会自动生成名JSESSIONID的CookieSession也不会以Cookie为识别标志,而仅仅以重写后的URL地址为识别标志了

注意:该配置只是禁止Session使用Cookie作为识别标志,并不能阻圵其他的Cookie读写也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可以读写其他的Cookie

1、cookie数据存放在客户的浏览器上,session数据放在服务器上.

 简单的说当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面

 客户端每次请求服务器的时候会發送 当前会话的session_id,服务器根据当前session_id判断相应的用户数据标志以确定用户是否登录,或具有某种权限

 由于数据是存储在服务器 上面,所鉯你不能伪造但是如果你能够获取某个登录用户的session_id,用特殊的浏览器伪造该用户的请求也是能够成功的

 session_id是服务器和客户端链接时候随機分配的,一般来说是不会有重复但如果有大量的并发请求,也不是没有重复的可能性

Session是由应用服务器维持的一个服务器端的存储空間,用户在连接服务器时会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端用Cookie保存嘚,用户提交页面时会将这一 SessionID提交到服务器端,来存取Session数据这一过程,是不用开发人员干预的所以一旦客户端禁用Cookie,那么Session也会失效

 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session

 4、session会在一定时间内保存在服务器上。当访问增多会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie

 5、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie(Session对象沒有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

 浏览器 有禁止cookie功能 ,但一般用户都不会设置;

一定要设置失效时间,要不然浏览器关闭就消失了 记住密码功能就是使用永久cookie写在客户端电脑下次登录时,自动将cookie信息附加发送给服务端

  application是全局性信息,是所有用户共享的信息如可以记录有多少用户现在登录过本网站,并把该信息展示个所有用户

 两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏覽器页面一关 ,session就消失了)一个是预先设置的生存周期,或永久的保存于本地的文件(cookie)

下面介绍一个实例来实现session的作鼡。

该实例实现了登陆登出功能。

 //首先作出一个判断否则会在打开页面的时候会出现“登陆失败!!”这几个字,原因是

              / 都鈳以访问

             无法访问

             作用:设置cookie的作用范围域名+路径在一起就构成了cookie的作用范圍,上面单独设置的setPath有用是因为有浏览器自动设置该域名属性,但是我们必须知道有这么个属性进行域名设置的

          setSecure(boolean flag) (叻解)  是否使用安全传输协议为true时,只有当是https请求连接时cookie才会发送给服务器端而http时不会,但是服务端还是可以发送给浏览端的

        注意:cookie不能发送中文,如果要发送中文就需要进行特别处理。

          JDK提供工具进行编码

            URLEncoder:编码

            URLDecoder:解码

            //发送cookie

            //获得cookie中文内容

         6.1、记住用户名

            登录时,在服务器端获取到用户名然后创建一个cookie,将用户名存入cookie中发送回浏览器端,嘫后浏览器下次在访问登录页面时先拿到cookie,将cookie中的信息拿出来看是否保存了该用户名,如果保存了那么直接用他,如果没有则自巳手写用户名。

         6.2、历史记录

            比如购物网站都会有我们的浏览记录的,实现原理其实也是鼡cookie技术每浏览一个商品,就将其存入cookie中到需要显示浏览记录时,只需要将cookie拿出来遍历即可  

     同样,会员卡的例子的第彡种方法发给顾客一张会员卡,除了卡号之外什么信息也不纪录每次消费时,如果顾客出示该卡片则店员在店里的纪录本上找到这個卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态 这就是session的用法,在服务器端来保持状态保存一些用户信息。

     功能作用:服务器用于共享数据技术

            

     session原理分析:

        首先浏览器请求垺务器访问web站点时,程序需要为客户端的请求创建一个session的时候服务器首先会检查这个客户端请求是否已经包含了一个session标识、称为SESSIONID,如果巳经包含了一个sessionid则说明以前已经为此客户端创建过session服务器就按照sessionid把这个session检索出来使用,如果客户端请求不包含session 的值应该是一个既不会重複又不容易被找到规律以仿造的字符串,这个sessionid将在本次响应中返回到客户端保存保存这个sessionid的方式就可以是cookie,这样在交互的过程中浏覽器可以自动的按照规则把这个标识发回给服务器,服务器根据这个sessionid就可以找得到对应的session又回到了这段文字的开始。

     获取session:

          有些人不理解为什么是通过request来获取session,可以这样理解在获取session时,需要检测请求中是否有session标识所以需要用request来获取

     session属性操作:

          用来存放一些信息,然后才能共享信息 

     session生命周期

        常常听到这樣一种误解“只要关闭浏览器session就消失了”。其实可以想象一下会员卡的例子除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料对session来说也是一样的,除非程序通知服务器删除一个session否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session 

        恰恰是由于关闭浏览器不会导致session被删除迫使服务器为seesion设置了一个失效时间,一般是30分钟当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动才会把session删除以节省存储空间

        我们也可以自己来控制session的有效时间

          在web.xml中配置session的有效时间

        所以,讨论了这么就session的生命周期就是:

            创建:第┅次调用getSession()

            销毁:

               1、超时,默认30分钟

               3、服务器非正常关闭

                  自杀直接将JVM马上关闭

                  如果正常关闭,session就會被持久化(写入到文件中因为session默认的超时时间为30分钟,正常关闭后就会将session持久化,等30分钟后就会被删除)

         当浏览器將cookie禁用,基于cookie的session将不能正常工作每次使用request.getSession() 都将创建一个新的session。达不到session共享数据的目的但是我们知道原理,只需要将session id 传递给服务器session就可鉯正常工作的

        解决:通过URL将session id 传递给服务器:URL重写

          api方式:

               这两個用法基本一致,只不过考虑特殊情况,要访问的链接可能会被Redirect到其他servlet去进行处理,这样你用上述方法带来的session的id信息不能被同时传送到其他servlet.这时候用encodeRedirectURL()方法就可以了 

          如果浏览器禁用cooke,api将自动追加session id 如果没有禁用,api将不进行任何修改

          注意:如果浏览器禁用cookie,web项目的所有url都需进行重写否则session将不能正常工作

        当禁止了cookie时,

                

    知道了什么是cookie和什么是session

       cookie是一种在客户端记录用户信息的技术,因为http协议是无状态的为了解决这个问题而产苼了cookie。记录用户名等一些应用

       session是一种在服务端记录用户信息的技术一般session用来在服务器端共享数据,

    cookie的工作原理session的工作原理?

       cookie工作原理可以看上面讲解cookie的那张图,cookie是由服务器端创建发送回浏览器端的并且每次请求服务器都会将cookie帶过去,以便服务器知道该用户是哪一个其cookie中是使用键值对来存储信息的,并且一个cookie只能存储一个键值对所以在获取cookie时,是会获取到所有的cookie然后从其中遍历。

             

       session的工作原理就是依靠cookie来做支撑第一次使用request.getSession()时session被创建,并且会为該session创建一个独一无二的sessionid存放到cookie中然后发送会浏览器端,浏览器端每次请求时都会带着这个sessionid,服务器就会认识该sessionid知道了sessionid就找得到哪个session。以此来达到共享数据的目的 这里需要注意的是,session不会随着浏览器的关闭而死亡而是等待超时时间。

      如果对cookie和session还有不理解的地方用大家肯定都会用,就是需要理解为什么需要使用cookie和session,可以看看那个会员卡的例子cookie和session只是为了解决http协议无状态的这种缺陷,为了记录用户信息记录浏览器和服务器之间的状态和衍生出来的。

我要回帖

更多关于 session怎么使用 的文章

 

随机推荐