javaweb (续Cookie) Session的介绍与基本使用学习笔记

1.什么是Session

 服务器端会话技术,是指javax.servlet.http.HttpSession接口,表示一次会话,我们可以把一次会话内需要共享的数据保存到HttpSession对象中。

2.Session对象的获取:

无参的

HttpSession request.getSesssion()

如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么应用创建session并返回。


有参数的

HttpSession request.getSession(boolean)

当参数为true时,与requeset.getSession()相同。当参数为false时,如果当前会话中存在session则返回,不存在返回null。

3.Session的实现原理

session底层是依赖Cookie的,我们来理解一下session的实现原理。

当我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!

当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。

查看Session实现原理图:

1.客户端发送请求后,服务器创建session,生成SessionId和session对象保存在服务器中

2.服务器通过Cookie把sessionId发送给客户端

3.客户端再次访问服务器时带上Cookie(即Session)

4.服务器通过Cookie中的SessionId找到客户端的session对象。

4.Session对象的域作用:

和浏览器有关 一次会话有效  找不到该会话的session id时就失效了
                                                 ————————浏览器关闭,或者是服务器重启

 HttpSession:一个会话(一次连接)创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据(即多个无关的Request对象也可以进行数据共享。

拓展)其他域对象:

    

  1. PageContext:在一个JSP中的域对象,代表当前JSP页面的范围。
  2. HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据.
  3. ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不重新启动服务器,那么ServletContext中的数据就可以共享。

5. Session对象的域方法:

 void setAttribute(String name, Object value):

用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与域对象相同。

 Object getAttribute(String name):

用来获取session中的数据,当前在获取之前需要先去存储才行

例如:String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性。

 void removeAttribute(String name):

用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做。

     Enumeration getAttributeNames():

获取所有Session域属性的名称。
 

6. Session与服务器

  session保存在服务器,而sessionId通过Cookie发送给客户端,但这个Cookie的生命时长是-1,即只在浏览器内存中存在(也就是说如果用户关闭了浏览器,那么这个Cookie就丢失了。)

  当用户再次打开浏览器访问服务器时,就不会有sessionId发送给服务器,那么服务器会认为你没有session,所以服务器会创建一个session,并在响应中把新创建的sessionId添加到Cookie中,发送给客户端。

你可能会说,那原来的session对象会怎样?当一个session长时间没人使用的话,服务器会把session删除了!这个时长在Tomcat中配置是30分钟,可以在${Tomcat安装目录}/conf/web.xml找到这个配置,当然你也可以在自己的web.xml中覆盖这个配置!

web.xml:
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

session失效时间也说明一个问题,如果你打开网站的一个页面开始长时间不动,超出了30分钟后,再去点击链接或提交表单时你会发现,你的session已经丢失了。

7. session的生命周期

  • 创建:第一次调用request.getsession()创建
  • 销毁:服务器非正常关闭(断电)

session超时
默认时间超时:30分钟  web.xml有配置 
手动设置超时:setMaxInactiveInterval(int ) 如果设置的值为零或负数,则表示会话将永远不会超时。了解手动干掉session
           ★session.invalidate()存放的私有的数据。

8.Cookie和Session的关系:

我们知道session依赖Cookie,那么session为什么依赖Cookie呢?因为服务器需要在每次请求中获取sessionId,然后找到客户端的session对象。那么如果客户端浏览器关闭了Cookie呢?那么session是不是就会不存在了呢?答案是否定的。

其实,还有一种方法让服务器收到的每个请求中都带有sessioinId,那就是URL重写!在每个页面中的每个链接和表单中都添加名为jSessionId的参数,值为当前sessionid。当用户点击链接或提交表单时服务器可以通过获取jSessionId这个参数来得到客户端的sessionId,找到sessoin对象。

  
    
        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值