汪星人 发表于 2014-3-18 12:40

java状态管理 cookie和session详细介绍

2、状态管理
1)什么是状态管理
将客户端(一般是浏览器)与服务器之间的多次
交互当作一个整体来看待,即将多次操作所涉及的
数据记录下来。
2)怎样进行状态管理
第一种方式,在客户端管理用户的状态
(cookie)。
第二种方式,在服务器端管理用户的状态
(session)。
3)cookie
a,什么是cookie?
   浏览器在访问服务器时,服务器将一些数据
以set-cookie消息头的形式发送给浏览器。浏览
器会将这些数据保存起来。当浏览器再次访问
服务器时,会将这些数据以cookie消息头的形式
发送给服务器。通过这种方式,可以管理用户的
状态。
b,怎样创建cookie?
   Cookie cookie = new Cookie(String name,
   String value);
   response.addCookie(cookie);
c,查询cookie
   //如果没有cookie,则返回null。
   Cookie[] cookies = request.getCookies();
   String name = cookie.getName();
   String value = cookie.getValue();
d,cookie保存时的编码问题
   cookie的值只能是ascii字符,如果是中文,
   需要将中文转换成ascii字符形式。
   可以使用URLEncoder.encode()方法和
   URLDecoder.decode()方法来进行这种转换。
e,cookie的保存时间
   cookie.setMaxAge(int seconds);
   seconds > 0:浏览器会将cookie以文件的方式
   保存在硬盘上。在超过指定的时间以后,会删除
   该文件。
   seconds < 0:默认值,浏览器会将cookie保存
   在内存里面。只有当浏览器关闭之后,才会删除。
   seconds = 0:删除。
f,删除cookie
   比如要删除一个name为"username"的cookie。
   Cookie c = new Cookie("username","");
   c.setMaxAge(0);
   response.addCookie(c);
g,cookie的路径问题
   浏览器在向服务器上的某个地址发送请求时,
会先比较cookie的路径与向访问的路径(地址)是
否匹配。只有匹配的cookie,才会发送。
   cookie的路径可以通过
   cookie.setPath(String path)方法来设置。
   如果没有设置,则有一个缺省的路径,缺省的
   路径是生成该cookie的组件的路径。
    比如: /appname/addCookie保存了一个cookie,
   则该cookie的路径就是/appname/addCookie。
   
   规则:
    cookie的路径必须是要访问的路径的上层目录
    或者是与要访问的路径相等,浏览器才会
    将cookie发送给服务器。
   
    一般可以设置setPath("/appname"),表示访问
    该应用下的所有地址,均会发送cookie。
h,cookie的限制
   cookie可以禁止
   cookie的大小有限制(4k左右)
   cookie的数量也有限制(浏览器大约能保存300个)
   cookie的值只能是字符串,要考虑编码问题。
   cookie不安全
练习:
写一个Add_FindCookieServlet,该servlet先查询
有没有一个名叫name的cookie,如果有,则显示
该cookie的值,如果没有,则创建该cookie(
cookie的名字:name,cookie的值:zs)。


4)session
a,什么是session?
浏览器访问服务器时,服务器会创建一个session
对象(该对象有一个唯一的id, 一般称为sessionId)
。服务器在缺省情况下,会将sessionId以cookie
机制发送给浏览器。当浏览器再次访问服务器时,
会将sessionId发送给服务器。服务器依据sessionId
就可以找到对应的session对象。通过这种方式,
就可以管理用户的状态。
b,如何获得session对象
   方式一:
    HttpSession session =
    request.getSession(boolean flag);
    当flag = true:
   服务器会先查看请求中是否包含sessionId,
   如果没有,则创建一个session对象。
   如果有,则依据sessionId去查找对应的
   session对象,如果找到,则返回。
   如果找不到,则创建一个新的session对象。
    当flag = false:
   服务器会先查看请求中是否包含sessionId,
   如果没有,返回null。
   如果有,则依据sessionId去查找对应的
   session对象,如果找到,则返回。
   如果找不到,返回null。
   方式二:
    HttpSession session =
    request.getSession();
    与request.getSession(true)等价。
c,HttpSession接口提供的一些方法
    //获得sessionId。
    String session.getId();
    //绑订数据
    session.setAttribute(
    String name,Object obj);
    //obj最好实现Serializable接口(服务器
    在对session进行持久化操作时,比如钝化
    、激活,会使用序列化协议)。
    Object session.getAttribute(String name);
    //如果name对应的值不存在,返回null。
    session.removeAttribute(String name);
d,session超时
    服务器会将超过指定时间的session对象
   删除(在指定的时间内,该session对象没有
   使用)。
    方式一:
   session.setMaxInactiveInterval(
    int seconds);
    方式二:
   服务器有一个缺省的超时限制,可以
    通过相应的配置文件来重新设置。
   比如可以修改tomcat的web.xml(
   tomcat_home/conf下面)。
   <session-config>
          <session-timeout>30</session-timeout>
       </session-config>
    另外,也可以只修改某个应用的web.xml。
e,删除session
   session.invalidate();
   
案例:
session验证
step1 在登录成功之后,在session上绑订一些数据。
比如:
session.setAttribute("user",user);
step2 在访问需要保护的页面或者资源时,执行
Object obj = session.getAttribute("user");
如果obj为null,说明没有登录,一般重定向到
登录页面。

发光的影子 发表于 2015-10-15 13:48

看了看学习学习哈哈哈哈

java宫城大师 发表于 2016-3-17 21:56


学习一下。谢谢:victory:

woniu 发表于 2016-4-12 12:20

这个项目太棒勒!下下来学习下!

welcome123 发表于 2016-4-18 17:15

以前不太理解,现在看了后,明白了很多

wudizxt 发表于 2017-8-14 08:31

不错不错不错
页: [1]
查看完整版本: java状态管理 cookie和session详细介绍