会话就是日常生活中非常常见的一种现象,当你拿起电话和朋友谈笑风生直到挂断电话就是一次会话,而在Web应用中的会话过程也类似与日常生活中的会话,它指浏览器和服务器之间连续发生的一系列请求和响应过程(注意是连续发生的,比如你在网上购物的整个过程就是一个会话)。会话过程中会产生一系列的数据,比如通话会有通话内容,而客户端与服务器交互时同样会产生数据。
为什么需要会话技术上面说到会话中会产生数据,而这些数据往往需要服务器进行保存,比如在购物过程中,你将商品加入购物车,然后付款,服务器需要将你的信息进行保存。说到保存,可以想到使用HttpServletRequest和ServletContext这两个对象,但是这种情况不能使用这两个对象来保存,原因如下:
- http请求是无状态的,因此每次请求都是一个新的请求,每次请求服务器都会为它创建一个HttpServletRequest对象,该对象只能保存本次请求的数据,因为付款和加购往往是两次请求,因此当你付款时是无法从HttpServletRequest对象中获得数据的。
- ServletContext对象是一个全局对象,它代表整个Web容器,因此整个Web应用共享同一个该对象,所以当有多个用户在加购付款,服务器是没办法区分哪些商品是哪些用户的
因此为了保存会话数据,就提供了cookie和Session两个对象。
会话技术会话技术分为客户端会话技术和服务端会话技术。
cookiecookie是客户端的会话技术,它将会话过程中的数据保存在用户的浏览器里面。
就比如日常生活中的会员卡,假如当你购物时,商家给你一张积分会员卡,卡上记录者你的信息,当你下次带上会员卡去购物时就能享受对应的优惠了,cookie的作用就类似于会员卡,用户访问服务器时服务器会给用户发送一些数据,这些数据就保存在cookie中,以后用户再次访问服务器时就会自动带上cookie。
使用步骤:
- 创建cookie对象, 绑定数据
new cookie(String name, String value) - 发送cookie对象
response.addcookie(cookie cookie) - 获取cookie,拿到数据
cookie[] request. getcookies()
默认情况下cookie在浏览器中保存的时间是有限的,当关闭浏览器时cookie就会被删除,因此为了能让它保存的时间更长,我们往往需要设置过期时间:
cookie.setMaxAge(int expriy)//参数为秒数
当然cookie对象还有很多方法,常用的有:
| 方法名 | 作用 |
|---|---|
| String getName() | 返回cookie的名称 |
| void setValue() | 为cookie设置一个值 |
| String getValue() | 返回cookie值 |
| int getMaxAge() | 返回cookie在浏览器客户端上保持的有效秒数 |
| void setPath() | 设置该cookie的有效目录路径 |
| void setDomain() | 设置cookie的有效域 |
一些细节:
- cookie在浏览器中保存多长时间?
- 默认情况下,当浏览器关闭后,cookie数据被销毁
- 持久化存储:setMaxAge(int explry)
-
cookie能不能存中文?
在tomcat 8之前cookie中不能直接存储中文数据。
需要将中文数据转码一般采用URL编码(%E3)(URLEncoder类)
在tomcat 8之后,cookie支持中文数据。但仍然不支持特殊字符 -
cookie共享问题?
假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
默认情况下cookie不能共享
setPath(string path) :设置cookie的获取范围。默认付况下,设置当前的虚拟目录如果要共享,则可以将path设置为"/" -
不同的tomcat服务器间cookie共享问题?
setDomain(string path): 如果设置一级域名相同,那么多个服务器之间cookie可以共享setDomain(" .baidu. com") ,那么tieba . baidu. com和news . baidu. com中cookie可共享
cookie可以将用户信息保存在浏览器中 ,并且可以在多次请求下实现数据共享。但是当传递的信息比较多,使用cookie技术显然会增大服务器程序的处理难度,所有就出现了Session技术。Session将会话产生的数据保存到服务器里面。
使用步骤
- 获取HttpSession对象 :
Httpsession session = request.getsession() - 使用HttpSession对象 :
向session里面存东西:void setAttribute(string name, object value)
从session里面获取东西:object getAttribute(string name)
删除session里面的数据:void removetAtribute(string name)
原理:
当客户端第一次向服务器发起请求时,服务器会为它创建一个session对象,然后把这个session对象的ID值以存到客户端的cookie中(JSESSIonID=xxxxxxx),当客户端下次请求服务器时,它会自动带上cookie,服务器就会读取cookie中的session ID,如果有,就会根据该ID找到之前Session对象,如果没有就会重新获取一个Session对象。就好比上面的购物案例一样,当商家给你会员卡的同时他也会在自己的电脑上记录你的会员信息,而会员卡上面往往会有个卡号,这个卡号就相当于Session ID,当你拿着会员卡去购物时商家就会根据卡号查询你的会员信息。
需要注意的是,这里Seesion的实现需要借助于cookie,如果客户端将cookie禁用之后就无法使用了。好比商家给你会员卡,然后你把会员卡扔了一样。
上面说cookie的作用时间是有限的,同样Session的作用时间也是有限的,cookie默认情况是关闭浏览器就失效,而Session是存在服务端的,而服务器往往是不会关机的,如果不设置过期时间,当用户过多时必然让服务器内存爆满。让Session失效的方式有两种:
1. 自生自灭(不同服务器有不同的失效时间,tomcat默认为30min,也可以自己配置) 2. 调用invalidate()方法
常用方法:
| 方法名 | 作用 |
|---|---|
| String getId() | 返回Session的ID值 |
| void invalidate() | 强制失效 |
| void getServletContext() | 获取ServletContext对象 |
| void setAttribute(String name,Object Value) | 向session中添加值(键值对形式) |
| void getAttribute(String name) | 根据名称获取值 |
| void removetAtribute(string name) | 删除值 |
一些细节
-
当客户端关闭后,服务器不关闭,两次获取session是否为同一 个?
事默认情况下不是。(因为这个存有JSESSIONID的cookie是服务器自动生成的)
如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间.
之后客户端再次访问服务端时就会将该cookie携带上,服务端通过 -
客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失
session的钝化:
在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:
在服务器启动后,将session文件转化为内存中的session对实即可。 -
session依赖于cookie实现,当cookie被禁用后可以通过URL重写来将JSESSIONID以URL参数形式传输
- session存储数据在服务器端,cookie在客户端
- session没有数据大小限制,而且能存储复制类型数据, cookie有大小限制。
- session数据安全, cookie相对于不安全
- Session是服务器自动建立的,用getSession就可以获得,cookie需要自己new
- 显示上次访问时间
- 登录认证
每个客户端请求都会和服务器建立一个会话,会有一个唯一的SessionId,
客户端在收到SessionId之后可以将seesionId保存(比如保存在cookie中),然后每次通过cookie的sessionId去验证。
- 。。。。



