1、状态管理 (1)什么是状态管理? 将浏览器与web服务器之间多次交互当作一个 整体来看待,并且,将多次交互所涉及的数据(即状态)保存下来。 (2)如何进行状态管理? 1)客户端的状态管理 将状态保存在客户端(浏览器),比如cookie。 2)服务器端的状态管理 将状态保存在服务器端,比如session。 2、cookie 1)什么是cookie? 当浏览器访问服务器时,服务器会发送少量的数据给浏览器,浏览器会将这些数据保存下来; 当浏览器再次访问服务器时,会将之前保存的这些数据发送给服务器(使用cookie消息头)。 2)创建cookie Cookie c = new Cookie(String name,String value); response.addCookie(c); 3)查询cookie Cookie[] cookies = request.getCookies();注意:该方法有可能返回null。 String cookie.getName(); //获得cookie的名称 String cookie.getValue(); //获得cookie的值 4)cookie的生存时间 cookie.setMaxAge(int seconds); seconds:单位是秒 seconds > 0: 浏览器会把cookie保存到硬盘上,超过指定的时间(seconds),浏览器会删除该cookie。 < 0: 缺省值,浏览器会把cookie保存到内存里面,只要浏览器关闭,cookie就会被销毁。 = 0: 删除cookie 5)编码问题 cookie只能保存合法的ascii字符,中文很显示不是ascii字符,需要将其转换成合法的ascii字符。 String URLEncoder.encode(String str,String code); 比如 URLEncoder.encode("李白","utf-8"); URLDecoder.decode(String str,String code); 6)路径问题 a,什么是路径问题? 浏览器在访问服务器的某个地址的时候,会比较cookie的路径是否与该地址匹配,只有匹配的cookie才会发送。 b,匹配的规则 要访问的地址必须是cookie的路径或者其子路径。 c,cookie有一个缺省的路径,值等于创建该cookie的web组件的路径: 比如: /web07/sub01/addCookie.jsp添加了一个cookie,则该cookie的缺省的路径等于"/web07/sub01"。 /web07/findCookie.jsp error /web07/sub01/findCookie2.jsp ok /web07/sub01/aaa/findCookie3.jsp ok d,修改cookie的路径: cookie.setPath(String path); 一般情况下,会将path设置为应用名,比如 cookie.setPath("/web07"); 7)添加一个cookie Cookie c = new Cookie("cookie1", URLEncoder.encode("李白","utf-8")); c.setMaxAge(3600); c.setPath("/appname"); response.addCookie(c); 8)cookie的限制 a, cookie可以被用户禁止。 b, cookie保存在客户端(浏览器),不安全,所以,如果要将敏感数据(比如账号、密码)保存在客户端,一定要加密。 c, cookie保存的数据大小有限制,大约是4k左右(跟浏览器有关系)。 d, 浏览器保存的cookie的数量也有限制,大约是300个左右(跟浏览器有关系)。 3、session(会话) 1)什么是session 浏览器访问服务器时,服务器会创建一个session对象,然后,服务器在默认情况下,会使用cookie机制将sessionId发送给浏览器。 浏览器再次访问服务器时,会将sessionId发送给服务器,服务器依据sessionId找到之前创建的session对象。 2)如何获得一个session对象 方式一 HttpSession s = request.getSession(boolean flag); 当flag = true时: 先查看请求当中是否有sessionId,如果没有,则创建一个session对象; 如果有,则依据sessionId查找对应的session对象, 如果找到,则返回,找不到,创建一个新的session对象。 当flag = false时: 先查看请求当中是否有sessionId,如果没有,则返回null; 如果有,则依据sessionId查找对应的session对象, 如果找到,则返回,找不到,返回null。 方式二 HttpSession s = request.getSession(); 等价于 request.getSession(true)。 3)常用方法 //获得sessionId String getId(); setAttribute(String name,Object obj); Object getAttribute(String name); removeAttribute(String name); 4)session超时 a,什么是session超时? 容器会将空闲时间过长的session对象删除掉。 容器默认的超时时间限制一般是30分钟。 b,修改容器缺省的超时限制 conf/web.xml <session-config> <session-timeout>30</session-timeout> </session-config> 也可以将以上配置放到某个具体的应用的web.xml文件里面。 c, setMaxInactiveInterval(int seconds); 5)删除session invalidate() 4、如果禁止cookie,如何继续使用session?(了解) (1)可以使用url重写来解决这个问题 (2)什么是url重写? 浏览器访问服务器上的某个地址时,需要使用服务器提供的地址(该地址后面会添加sessionId)。 (3)编程 a, response.encodeURL(String url); 该方法用于链接地址、表单提交地址的处理。 b, response.encodeRedirectURL(String url); 该方法用于重定向地址的处理,比如 response.sendRedirect(response.encodeRedirectURL("list.do")); c,转发不用考虑。 5、session的优缺点(跟cookie相比) 1),优点 a,安全(session将状态保存在服务器端,而cookie将状态保存在浏览器端)。 b,保存的数据量更大(cookie大约只能保存4k左右)。 c,保存的数据类型更丰富(cookie只能保存字符串)。 2),缺点 session要将状态保存的服务器端,会占用服务器更多的内存空间,而cookie将状态保存在客户端,对服务器不会占用过多的内存空间。 |
|