cookie和session'的学习

本文详细介绍了状态管理的概念,包括客户端状态管理(Cookie)和服务端状态管理(Session),并提供了具体的实现方法和技术要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态管理

  1)什么是状态管理

    将客户端(一般是浏览器)与服务器之间的多次交互当作一个整体来看待,即将多次操作的数据记录下来。

  2)怎样进行状态管理

    第一种方式:cookie(在客户端管理用户的状态)

    第二种方式:session(在服务端管理用户的状态)

  3)cookie

    1)什么是cookie

    浏览器在访问服务器时,服务器将一些数据以set-cookie消息头的形式发送给浏览器。浏览器会将这些数据保存起来,当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式发送给服务器。通过这种方式,可以管理用户的状态。

    2)创建cookie

    Cookie cookie = new Cookie(String name,String value);

    response.addCookie(cookie);

    3)查询cookie

    //如果没有cookie,则返回null。

    Cookie[] cookies = reqest.getCookie();

    String name = cookie.getName();

    String value = cookie.getValue;

    4)cookie保存时的编码问题

    cookie的值只能是ascii字符,如果是中文,需要将中文转换成ascii字符形式。可以使用

    URLEncoder.encode()方法和URLDecoder.decode()方法来进行这种转换。

    5)cookie的保存时间

    cookie.setMaxAge(int seconds);

    seconds>0

    浏览器会将cookie以文件的方式保存在硬盘式。在超过指定的时间以后,会删除该文件。

    seconds<0

    默认值,浏览器会将cookie保存在内存里面。只有当浏览器关闭以后,才会删除。

    seconds=0

    立即删除该Cookie

    6)删除cookie

    比如要删除一个name为"username"的cookie。

    Cookie c = new Cookie("username","");

    c.setMaxAge(0);

    response.addCookie(c);

    7)cookie的路径问题

    浏览器在向服务器上的某个地址发送请求时,

    会先比较cookie的路径与向访问的路径(地址)是否匹配,只有匹配的cookie,才会发送。

    cookie的路径可以通过cookie.setPath(String path)方法来设置。

    如果没有设置,则有一个缺省的路径,缺省的路径是生成该cookie的组件的路径。

    比如:/appname/addCookie保存了一个cookie

    则该cookie的路径就是/appname/addCookie。

    规则:

            cookie的路径必须是要访问的路径的上层目录或者是与要访问的路径相等,浏览器才会将cookie发送给服器。

            一般可以设这setPath("/appname"),表示访问该应用下的所有地址,均会发送cookie。

    8)cookie的限制

       cookie可以禁止

       cookie的大小有限制(4k左右)

       cookie的数量也有限制(浏览器大约能保存300个)

       cookie的值只能是字符串,要考虑编码问题。

       cookie不安全

session

  1)什么是session

    浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的id,一般称为sessionId)。服务器在缺省情况下,会将sessionId以cookie机制发送个浏览器。当浏览器再次访问服务器时,会将sessionId发送给服务器。服务器依据sessionId就可以找到对应的session对象。通过这种方式,就可以管理用户的状态。

  2)如何获得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)等价

  3)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);

  4)session超时

    服务器会将超过指定时间的session对象删除(在指定的时间内,该session对象没有使用)

    方式一:

    session.setMaxInactiveInterval(int seconds);

    方式二:

    服务器有一个缺省的超时限制,可以通过相应的配置文件来重新设置。

    比如可以修改tomcat的web.xml(tomcat_home/conf下面)。

    <session-config>

         <session-timeout></session-timeout>

    </session-comfig>

    另外,也可以只修改某个应用的web.xml。

  5)删除session

    session.invalidate()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值