http://my.oschina.net/kevinair/blog/192829
会话
用户打开一个浏览器,点击多个超链接,访问服务器多个Web资源,然后关闭浏览器,整个过程称之为一个会话
服务器管理客户端的状态称为会话状态的管理。
管理Http协议会话状态保存会话数据的两种技术
Cookie和Session
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用于使用浏览器再去访问服务器中的web资源时,就会带着各自额数据去。这样web资源处理的就是用户各自的数据了
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个独享的session对象,由于session为用户浏览器独享,具有独立编号所以用户在访问服务器的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务。
cookie存在客户端,存在安全问题,session将数据保存在服务器端,安全但是占用服务器内存资源。
案例;返回上次访问时间
1.第一次访问时向客户端写入cookie
Cookie cookie =new Cookie("name","value");
response.addCookie(cookie);
2.当客户端存在cookie滞后,以后每次请求自动携带HTTP协议请求自动头信息Cookie:name=value,服务器获取需要的cookie数据
Cookie [] cookies=request.getCookies();//获取所有cookie
for(Cookie cookie:cookies){
if(cookie.getName().equals("name")){
进行value值处理
}
}
常用API方法
cookie
request.getCookies();获得请求中所有的cookie信息返回的而是一个Cookie[]数组//在请求头信息中Cookie:
response.addCookie(new Cooke("",""));向客户端写回cookie,在响应头信息中为set-Cookie:
cookie.getName();获得cookie名称
cookie.getValue();获得cookie值。
cookie.setValue("value");更改cookie值
setMaxAge(time)//设置cookie过期时间,使其成为持久性cookie,time单位是秒
getMaxAge()
setPath()//设置有效路径。
getPath()
setDomain(".baidu.com")设置有效域名
getDomain()
要注意cookie的name值是不允许被修改的,所以没有setName()方法。
cookie信息默认情况下是保存在浏览器内存中的,是会话cookie,会话cookie会在浏览器关闭,会话结束的时候会自动清除,持久cookie是指cookie数据保存在本地硬盘上,通过setMaxAge方法设置,会话关闭不会清除cookie,请求头信息中为Expires:,如果将setMaxAge值改为0,会命令浏览器删除该cookie,要注意删除cookie时要保证是有效路径,否则不会删除。一般再删除的同时会重新设置有效路径,以保证路径一致。
默认情况下载生成cookie时,产生默认的访问路径,默认是生成cookie的路径(servlet路径的上一级),如果下次访问服务器的路径与默认的有效路不一致的话是不会携带对应的cookie信息 的。
http//localhost/test/servlet/path
http//localhost/test/servlet2
对于上面的路径如果cookie路径为/test,访问两条路径有效路径一致会携带cookie信息
如果cookie路径为/test/servlet,访问第一条路径会携带信息,访问第二条路径不回携带cookie信息
设置有效域名的话,访问该域名会携带cookie信息,这种cookie如果域名不是产生cookie的域名的话是第三方cookie是不安全的浏览器一般也是禁用的,如果是产生cookie的域名是第一方cookie不过一般也很少使用
Session(会话)
常用API方法
request.getSession();获取一个HttpSession对象
Session.setAttribute(name,value);添加session信息
Session.getAttribute(name);获取session信息
Session原理
Session浏览器独享的原因是,浏览器访问服务器serlvet程序时,服务器产生一个session对象并分配sessionid编号,将session 的id信息以cookie的形式写入浏览器,浏览器通过cookie查询id直接访问对应编号session对象,而其他浏览器没有具有此cookie就不能访问session对象。
Session同个浏览器共享的原理
将写回给浏览器的cookie值JSESSIONID持久化存储
禁用cookie后的session处理
解决方案URL重写添加sessionid信息,而不通过cookie信息。
response.encodeRedirectURL(java.lang.String url)用于对sendRedirect方法后的url地址进行重写
response.encodeURL(url)用于对表单action和超链接的url地址进行重写。
Session的失效时间
web.xml可以配置session的失效时间
<session-config>
<session-timeout>30</session-timeout>默认是30分钟,30分钟之内没有再次使用session对象时会被销毁
</session-config>
cookie的生命周期
创建与销毁
创建Cookie cookie=new Cookie(name,value);response.addCookie(cookie);
销毁;对于会话cookie浏览器一关闭就会被销毁,对于持久cookie会在cookie过期时被销毁
session的生命周期
创建;request.getSession()
销毁;服务器关闭时会销毁,session过期时销毁,手动调用session.invaliadte()方法销毁
session常用来完成系统权限和认证功能
权限;在用户身份认证后,根据session分配管理权限
认证;用户登录,认证身份
Servlet三种数据范围
ServletContext
HttpServletRequest
HttpSession
三种数据范围,每个对象各自维护一个类似map集合的数据结构,具备相同的几个方法
setAttribute存入一个属性
getAttribute取出一个属性
removeAttribute移除一个属性
三种数据范围对象的使用情况
servletcontext服务器启动时创建,服务器关闭时销毁,所有Servlet共享,保存一些全局数据
例如;数据库连接池,工程配置属性,配置文件内容,一般不建议随意使用,因为生命周期过长占用服务器资源
HttpSession,常用来保存一些与用户相关的数据,在request.getSession时创建,在三种情况下销毁
例如;系统登录信息,购物车数据
HttpServletRequest在客户端发起请求时,服务器创建对象,在响应结束时销毁,用来保存servlet向JSP传输数据信息
例如;执行某个操作将操作结果传递JSP
具体使用的规则是尽量使用生命周期较短,内存占用较小的对象进行保存