[关闭]
@cxm-2016 2016-12-26T19:32:57.000000Z 字数 2451 阅读 1875

Java Web (五)——会话技术

Web

版本:1
作者:陈小默
声明:禁止商业,禁止转载


会话

当用户打开浏览器,点击链接访问服务器的web资源,然后关闭浏览器,整个过程被称之为一次会话。

那么每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自产生一些数据,程序要想办法为每个用户保存这些数据。

例如:用户点击超链接通过一个Servlet购买了一个商品,程序应该如何想办法保存用户购买的商品,以便用户结算。

Cookie是一种客户端技术,程序吧每个用户的数据以cookie的形式发送给浏览器。当用户使用浏览器再去访问服务器时,就会带着各自的数据了。

我们实现一个记住用户上次登录事件的小程序

  1. override fun doGet(req: HttpServletRequest, resp: HttpServletResponse) {
  2. resp.setHeader("Content-Type", "text/html;charset=utf-8")
  3. val cookies = req.cookies
  4. val writer = resp.writer
  5. if (cookies.size < 2) {
  6. writer.print("欢迎您")
  7. } else {
  8. cookies.filter { it.name == "date" }
  9. .forEach { writer.print("上次登录时间 ${it.value}") }
  10. }
  11. resp.addCookie(
  12. Cookie("date", getTime()).let {
  13. it.maxAge = 5
  14. it
  15. })
  16. writer.flush()
  17. }
  18. fun getTime(): String {
  19. val format = SimpleDateFormat("HH:mm:ss")
  20. return format.format(Date())
  21. }

一个cookie只能标识一种信息,它至少包含一个该信息的Name和Value。

一个Web站点可以给一个WEb浏览器发送多个cookie,一个Web浏览器也可以存储多个Web站点的cookie。

一般的浏览器只能存放300个cookie,每个站点最多存放20个。每个cookie的大小限制为4KB。

如果创建了一个cookie,默认情况下他是一个会话级别的cookie,当用户退出浏览器之后即被删除。弱希望浏览器将该cookie存储在磁盘上,需要指定maxAge,并给出一个以秒为单位的时间。设置为0或小于0的值表示删除该cookie。

setPath或者getPath是用来设置和获取cookie适用站点的。如果不设置则默认为当前站点有效。

Session

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

session是一个域对象,作用范围为整个会话。

Session和Cookie的主要区别在于:

Session的生命周期

Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象,如果服务器发现内存中没有该浏览器对应的session就会创建该session并返回,如果已经存在则直接返回已有的session。

session并不会一直存在在内存中,经过一段时间如果无人使用session将会被销毁,一般这个时间为30分钟,可以在web.xml中配置<session-config>设置该时间值

调用session的invalidate()也可以销毁session

当程序第一次request.getSession方法时创建对象,当Session超时后(可在web.xml文件中中设置)销毁。

注意:当服务器正常关闭的时候,未过期的Session会被钝化到tomcat的work目录下,等服务器再次启动的时候活化此Session

Session 原理

当调用request.getSession方法时,服务器会检查请求中的JSESSIONIDcookie,如果没有表示浏览器首次访问此站点,然后会创建一个新的Session,并在响应中添加cookie。默认情况下,cookie JSESSIONID的path是当前应用名,并且未设置过超时。

如果想让浏览器保存此cookie,需要手动发送cookie逼格设置超时时间。

URL重写

当浏览器禁用了cookie或者是客户端不支持cookie,那么我们需要进行URL重写

防止表单重复提交

表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝用户提交的表单请求:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注