分享

状态管理cookie和session

 蹇胜雄 2015-07-10
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将状态保存在客户端,对服务器不会占用过多的内存空间。
    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多