Servlet的Cookie和Session问题分析

 1.状态管理
## (1)什么是状态管理?
    将浏览器与web服务器之间多次交互当做一个整体来处理,并且
    将多次交互所涉及的数据(即状态)保存下来。
## (2)如何进行状态管理
    1)将状态保存在客户端(浏览器)   
        Cookie 
    2)将状态保存在服务器端 
         session 
## (3)Cookie
    1)什么是Cookie?
    服务器临时存放在浏览器端的少量数据
    2)工作原理
    当浏览器访问服务器时,服务器会将少量数据发送给浏览器
    (使用set-cookie消息头),浏览器会将这些数据临时保存下来;
    当浏览器再次访问服务器时,会将之前保存的数据发送给服务器
    (使用cookie消息头)。
![](cookie.png)

    3)添加cookie
         Cookie c = new Cookie(String name,String value);
        response.addCookie(c);
    4)读取cookie
        Cookie[] request.getCookies();
        注:有可能返回null。
        String cookie.getName();
        String cookie.getValue();
    5)编码问题
        a. cookie只能保存合法的ascii字符,如果是中文,
        需要将中文转换成合法的ascii字符串。
            String URLEncoder.encode(String str,String charset);
            String URLDecoder.decode(String str,String charset);
        b.建议添加cookie时,都统一编码。

 

### 

6)生存时间问题
    a.默认情况下,浏览器会将cookie保存在内存里面。
    只有浏览器不关闭,cookie就会一直保存,浏览器一关闭,
    cookie就会被删除。
    b.cookie.setMaxAge(int seconds)
    注:
        b1. seconds单位是秒。
        b2. 当seconds > 0时,浏览器会将cookie保存在硬盘上
        (文件的形式存放),超过指定时间,浏览器会销毁该cookie。
            当seconds < 0时,默认值(即保存在内存里面)。
            当seconds = 0时,删除cookie。
                比如,要删除一个名称为username的cookie:
                Cookie c  = new Cookie("username","");
                c.setMaxAge(0);
                response.addCookie(c);
7)cookie的路径问题
    a.浏览器访问服务器时,会比较cookie的路径是否与
    要访问的路径匹配,只有匹配的cookie才会被发送。
    b.cookie的默认路径
        默认等于添加该cookie的web组件的路径。
        比如  /servlet-day06/biz01/addCookie.jsp添加了
        一个cookie,则该cookie的默认路径就是 
        /servlet-day06/biz01

我有个疑问: 就是添加cookie的web组件是com.zj.web.CheckcodeServlet,那这个cookie的默认路径是什么?我试了一下,用getPath()方法的得到的路径是null?
没弄明白。从浏览器发给服务器的cookie里只有cookie的名称和值,没有cookie的路径。

解决:就算你不设置Cookie的path,Cookie也是有路径的。这个路径就是请求的路径。例如在请求http://localhost/day07_03/AServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/。

例如请求的路径是http://localhost/day07_03/servlet/BServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/servlet/。
--------------------- 
作者:李昆鹏 
来源:CSDN 
原文:https://blog.csdn.net/weixin_41547486/article/details/81294238 
版权声明:本文为博主原创文章,转载请附上博文链接!

    c.匹配规则
        要访问的路径必须等于cookie的路径或者是其子路径,
        符合该要求的cookie才会被发送出去。
        比如,cookie的路径是   /servlet-day06/biz01,
        则:
        /servlet-day06/findCookie1.jsp  不会
        /servlet-day06/biz01/findCookie2.jsp  会
        /servlet-day06/biz01/sub/findCookie3.jsp  会
    d.cookie.setPath(String path)
        注:该方法用于设置cookie的路径
8)cookie的限制
    a.可以被用户禁止。  
    b.只能保存少量的数据(大约4k左右)。
    c.保存的数量也有限制(大约几百个)。
    d.只能保存字符串,对于中文,需要编码。
    e.不安全。


##  今天终于验证了cookie的生存时间问题,一直纠结于cookie是在关闭浏览器窗口还是关闭整个浏览器,cookie会销毁?验证的结果是关闭那一个浏览器窗口是不会销毁cookie的,必须要关闭整个浏览器,cookie才会销毁。

 

2. Session(会话)
## (1)什么是Session?
    服务器端为保存状态而创建的一个特殊的对象。
## (2)工作原理

//默认以cookie的方式发送是啥意思??

        浏览器访问服务器时,服务器会创建一个session对象(该对象
    有一个唯一的id,一般称之为sessionId),服务器会将这个
    sessionId发送给浏览器(默认以cookie的方式发送),浏览器
    会将sessionId保存下来(保存在内存);当浏览器再次访问
    服务器时,会将sessionId发送给服务器,服务器依据sessionId
    找到对应的session对象。
![](session.png)

## (3)获取session对象
    1)HttpSession s = 
            request.getSession(boolean flag);
        a.flag为true时
            先查看请求当中有没有sessionId,如果没有,则创建
            session对象;如果有sessionId,则依据该sessionId
            去查找对应的session对象(如果找到了,则返回,找不到,
            则创建一个新的session对象)。
        b.flag为false时
            先查看请求当中有没有sessionId,如果没有,返回null;
            如果有sessionId,则依据该sessionId
            去查找对应的session对象(如果找到了,则返回,找不到,
            返回null)。
    2)HttpSession s = 
            request.getSession();
        等价于request.getSession(true);    
## (4)绑订数据相关的几个方法
        session.setAttribute(String name,Object obj)
        Object session.getAttribute(String name);
        removeAttribute(String name);    

 

## (5)session超时
    1)什么是session超时
    服务器会将空间时间过长的session对象删除掉。
    注:默认的超时时间限制是30分钟。
    可以修改服务器缺省的超时时间限制
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    2)session.setMaxInactiveInterval(int seconds)
        
## (6)删除session
    session.invalidate()

# 3. session验证
    step1.登录成功之后,在session对象上绑订一些数据,比如
        session.setAttribute("user",user);
    step2.当用户访问需要保护的资源的时候(只有登录成功才能访问的资源)    Object obj = session.getAttribute("user");
        if(obj == null){
            //没有登录
            response.sendRedirect("login.jsp");
        }
            
# 4. 验证码(扩展)
![](checkcode.png)
    
    练习: 生成一个长度固定为5个字符,并且这些字符要求从
        (A~Z,0~9)中选取,比如 X09BD
                                    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值