转载地址:http://www.phperzone.cn/portal.php?aid=718&mod=view
一、状态管理
1)什么是状态管理? 将浏览器与web服务器之间多次交互过程当做一个整体来处理,并且将多次交互所涉及的数据进行管理。 2)状态管理技术cookie: a,什么是cookie? 是一种客户端(浏览器)的状态管理技术。 浏览器在访问web服务器的时候,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器会将这结数据保存下来;当浏览器再次访问服务器的时候,会将这些数据以cookie消息头的方式发送给服务器。 b,创建cookie Cookie c = new Cookie(String name,String value); response.addCookie(c); c, 查询cookie //如果没有cookie,返回null Cookie[] request.getCookies(); String cookie.getName(); String cookie.getValue(); d, 编码问题 cookie的值只能是ascii字符,对于中文,需要将中文转换成相应的ascii字符串的表示形式。 String URLEncoder.encode(String,String enc) //创建 new Cookie(String name,URLEncoder.encode(String,"utf-8")) String URLDecoder.decode(String,String)//取 URLDecoder.decode(cookie.getValue(),"utf-8") e, cookie的生存问题 默认情况下,浏览器会将cookie保存在内存里,除非浏览器关闭,cookie一直存在。 用setMaxAge(int seconds)设置cookie保存时间 该方法需要注意: (1) 单位是秒 (2) seconds >0 : cookie会保存在硬盘上,超过指定的时间,浏览器会删除该cookie。 seconds <0 : 缺省值(保存在内存里) seconds =0: 删除cookie, 比如,要删除一个名叫addr的cookie: Cookie c = new Cookie("addr",""); c.setMaxAge(0); response.addCookie(c); f,cookie的路径问题 f1:浏览器在向服务器的某个地址发请求时,会先比较cookie的路径与要访问的这个地址是否匹配,只有匹配的cookie才会发送。 f2:cookie会有一个路径(是一个字符串),该路径默认情况下等于创建该cookie的组件的路径。 比如,/web06_2/app1/addCookie.jsp创建的cookie,其路径就等于"/web06_2/app1"。 /web06_2/findCookie.jsp error /web06_2/app1/findCookie1.jsp ok /web06_2/app1/sub/findCookie2.jsp ok f3: 只有要访问的地址是cookie的路径或者其子路径时,浏览器才会发送该cookie。 f4:可以用setPath(String path);方法设置cookie的路径 常见的使用是: setPath("/appname");访问该应用的所有资源都会带cookie过去了 g,cookie的限制 (1), cookie可以被用户禁止。 (2), cookie能够保存的数据大小有限制(大约4k)。 (3), cookie的个数有限制(浏览器在本地最大能够保存约300个左右的cookie)。 (4), cookie不安全session: (1)什么是session? 是一种服务器端的状态管理技术。 浏览器访问服务器的时候,服务器会创建一个session对象(每一个session对象都有唯一的一个id号,一般称之为sessionId),默 认情况下,服务器会使用cookie技术将sessionId发送给浏览器,浏览器会将sessionId保存下来。当浏览器再次访问服务器的时候,会将 sessionId发送给服务器,服务器依据sessionId,就可以找到之前创建的session对象。 (2)如何获得session对象? a, 方式一: HttpSession s = request.getSession(); 等价于request.getSession(true)。 b, 方式二: HttpSession s = request.getSession(boolean flag); 当flag=true时: 服务器会查看请求当中是否有sessionId,如果没有,则创建一个session对象;如果有sessionId,则依据sessionId查找对应的session对象,如果找到了,则返回;找不到,再创建一个新的session对象。 当flag=false时: 服务器会查看请求当中是否有sessionId,如果没有,会返回null;如果有sessionId,则依据sessionId查找对应的session对象,如果找到了,则返回;找不到,返回null。 (3)HttpSession中声明的几个常用方法 setAttribute(String name,Object obj); //如果绑订名称对应的值不存在,返回null。 Object getAttribute(String name); removeAttribute(String name); (4)session的超时 1)服务器会将空闲时间过长的session对象从内存空间当中删除。服务器一般会有一个缺省的超时时间限制(30分钟)。 2)可以修改超时限制 对于tomcat,可以修改conf\web.xml,修改完成需要重新启动服务器。 <session-config> <session-timeout>30</session-timeout> </session-config> 3)编程的方式 setMaxInactiveInterval(int seconds); (5) 删除session invalidate();二、session与cookie的区别 (1)cookie是一种客户端的状态管理技术,将状态写在浏览器端, 而session是一种服务器端的状态管理技术,将状态写在web服务器上面。 (2) cookie有很多限制: a,可以被用户禁止 b,cookie能够保存的数据比较小(大约4k),而且保存的个数也有限制(300个左右)。 c,cookie不安全 d,cookie只能保存字符串 而session能够保存更多的数据,相对更安全,保存的数据类型更丰富。 session会将所有的状态写在服务器端,所以服务器的压力比较大,而cookie没有这个问题。小知识:如果用户禁止cookie,如何继续使用session(了解) (1)url重写 在请求地址后面添加sessionId,一般由服务器来生成这个地址。 (2)编程: //链接地址,表单提交地址 a, response.encodeURL(String url); //重定向 b, response.encodeRedirectURL(String url); //转发根本不用考虑