@cxm-2016
2016-12-26T19:32:57.000000Z
字数 2451
阅读 1844
Web
版本:1
作者:陈小默
声明:禁止商业,禁止转载
当用户打开浏览器,点击链接访问服务器的web资源,然后关闭浏览器,整个过程被称之为一次会话。
那么每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自产生一些数据,程序要想办法为每个用户保存这些数据。
例如:用户点击超链接通过一个Servlet购买了一个商品,程序应该如何想办法保存用户购买的商品,以便用户结算。
Cookie是一种客户端技术,程序吧每个用户的数据以cookie的形式发送给浏览器。当用户使用浏览器再去访问服务器时,就会带着各自的数据了。
我们实现一个记住用户上次登录事件的小程序
override fun doGet(req: HttpServletRequest, resp: HttpServletResponse) {
resp.setHeader("Content-Type", "text/html;charset=utf-8")
val cookies = req.cookies
val writer = resp.writer
if (cookies.size < 2) {
writer.print("欢迎您")
} else {
cookies.filter { it.name == "date" }
.forEach { writer.print("上次登录时间 ${it.value}") }
}
resp.addCookie(
Cookie("date", getTime()).let {
it.maxAge = 5
it
})
writer.flush()
}
fun getTime(): String {
val format = SimpleDateFormat("HH:mm:ss")
return format.format(Date())
}
一个cookie只能标识一种信息,它至少包含一个该信息的Name和Value。
一个Web站点可以给一个WEb浏览器发送多个cookie,一个Web浏览器也可以存储多个Web站点的cookie。
一般的浏览器只能存放300个cookie,每个站点最多存放20个。每个cookie的大小限制为4KB。
如果创建了一个cookie,默认情况下他是一个会话级别的cookie,当用户退出浏览器之后即被删除。弱希望浏览器将该cookie存储在磁盘上,需要指定maxAge,并给出一个以秒为单位的时间。设置为0或小于0的值表示删除该cookie。
setPath
或者getPath
是用来设置和获取cookie适用站点的。如果不设置则默认为当前站点有效。
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
session是一个域对象,作用范围为整个会话。
Session和Cookie的主要区别在于:
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
当调用request.getSession
方法时,服务器会检查请求中的JSESSIONID
cookie,如果没有表示浏览器首次访问此站点,然后会创建一个新的Session,并在响应中添加cookie。默认情况下,cookie JSESSIONID的path是当前应用名,并且未设置过超时。
如果想让浏览器保存此cookie,需要手动发送cookie逼格设置超时时间。
当浏览器禁用了cookie或者是客户端不支持cookie,那么我们需要进行URL重写
表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝用户提交的表单请求: