Session是如何其作用的

  • Http本身是无状态协议,不能记录用户的状态,这样从一个客户端发送的多个请求对服务器来说相当于多个客户端发送过来的。
  • 为了解决这个问题,我们使用Session来保持用户的状态,Session表示一次回话,容器会为每一个客户端创建一个唯一的sessionId。然后把这个id通过reponse返回给客户端,客户端再次发送请求的时候会在request中携带这个id,以表示是同一个会话
  • 通常这个sessionId是放在request的cookie中的。

创建Session

先看一小段代码:

  • session本身的创建是有容器完成的,我们只需要获取就好了.
  • request.getSession(false)表示每次都要获取已经存在的session,如果没有则返回Null
  • request.getSession()表示获取一个session,如果存在根据sessionId获取,如果不存在,则创建一个。
  • session.isNew()查看这个session是否是新创建的,即还没有被response返回给客户端过。

URL重写


  • 如果浏览器关闭了cookie之后,原来的sessionId是保存在Cookie中的,所以这个session就没有用了,我们还能使用URL重写的办法来保持会话的状态。
  • 使用response.encodeURL能够给链接的最后面加上jsessionid,这样就能够保持状态了。
  • 在一个Servlet中还能够使用response.sendRedirect(response.encodeRedirectURL("TestSession"));来在重定向中加入jsessionid
  • 这个jsessionid是不能够通过request.getParamter获取的,我们也不能在头中创建这样的变量,实际上jsessionid只能存在于URL的后面或者是Cookie中。

Session的关键方法

  • getCreationTime(),虽然不能手工创建Session,但是能够通过这个方法获得创建的时间
  • setMaxInactiveInterval(秒数 ) 。另外可以使用 <session-config><session-timeout> 分钟数 </session-timeout></session-config>
  • get/setAttribute()
  • invalidate()使Session失效
  • 对于失效的Session再调用isNew()或者是getAttribute等方法的时候会报错。

Cookie


 

  • Cookie除了能够帮助实现Session之外还有其他的一些用途。
  • Cookie能够保存name/value对儿,在浏览器和服务器之间传递。
  • 出了JSESSIONID cookie之外其他的Cookie能够设定为在服务器停止之后任然存在在客户端电脑上。
  • 能够通过setMaxAge()方法设置关闭浏览器器之后Cookie存在的时间,可以发现JSESSIONID Cookie的maxage为-1.
  • 能够通过response.addCookiezengjiaCookie。

监听器

  • 有的时候我们需要监听servelt或者是session的状态,比如在他们创建之前做某些操作,这时我们需要的就是监听器listener。
  • 监听器能够监听context和session等的创建,消亡,属性的增加减少等等,不同的操作需要实现不同的结构。
  • 主要的接口有ServeltContextListener,ServletContextAttributeListener,HttpSessionListener等等接口。
  • 写好类之后还需要在DD中加入配置<listener><listener-class></listener>
  • HttpSessionListener中能够监听创建和消亡
  • HttpSessionAttributeListener能够监听属性的添加、移除和改变,并且其中参数event能够通过event.getName得到变更属性的名称等等信息。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐