Cookie 和 Session 详解

Cookie
1、Cookie :是存储在客户端 (浏览器管理,存储在客户端电脑的C盘)
2、浏览器一般允许存储300个Cookie,允许每个站点存储20个Cookie,每个Cookie大小不能超过4k。
3、Cookie如果不设置setMaxAge(秒)默认浏览器关闭Cookie就会被删除,如果想要删除该Cookie可以将setMaxAge(0)。
4、浏览器是如何知道那个Cookie对应服务器的呢?
浏览器会将 服务器地址 作为 Cookie的 key,当下次访问 该地址时,会根据key查找出对应的Cookie带过去(我们也可以通国cookie.setPath(“/JavaWebTest”),来改变Cookie的Key,默认情况下只能应用后的地址,不能修改服务器主机。)
(因为如果可以修改主机(例如为:www.xxxx.com),那么每次浏览器访问xxx网站时,都会Cookie,势必造成数据的雍总)。

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String key = "lastVisitTime";
        response.setCharacterEncoding("UTF-8");
        PrintWriter writer = response.getWriter();
        writer.write("你上次访问的时间是:");
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for(int i=0;i<cookies.length; i++ ){
                Cookie cookie = cookies[i];
                if(key.equals(cookie.getName())){
                    long LastTime = Long.parseLong(cookie.getValue());
                    writer.write(new Date(LastTime).toLocaleString());
                    break;
                }
            }
        }
        Cookie cookie = new Cookie(key, String.valueOf(System.currentTimeMillis()));
        //设置有效时间
        cookie.setMaxAge(30*24*3600);
        //告诉浏览器,在访问JavaWebTest应用时将cookie带给服务器,(注意如果没有设置,默认当前Servlet路径)
        cookie.setPath("/JavaWebTest");
        response.addCookie(cookie);
    }

Session
1、Session 是出储存在服务器端(占用服务器内存),Session的Id由Cookie保存,Cookie被禁用后,Session功能也会受到影响。(下面会有分析)

2、Session生命周期:
Session,通过request.getSession() 被创建。默认30分钟没有被使用 Session被服务器销毁。(web.xml 中可以配置时间)或者调用 session.invalidate();

<session-config>
    <!-- 10分钟没有使用被销毁 -->
    <session-timeout>10</session-timeout>
</session-config>

3、浏览器在访问时,服务器是如何知道该取那个Session 是的呢?
服务器将SessionId 存入 Cookie中 返回给浏览器,浏览器访问时,在通过Cookie的到SessionId。(这里也有一个问题,Cookie默认情况下,浏览器关闭就被销毁,所有Session也就无法获取,解决该问题就必须手动模仿服务器创建的Cookie在覆盖它。)

通过浏览器工具 查看 http请求。你会发现,Cookie里面有这么一行。
这里写图片描述

session.setAttribute("goods", "笔记本电脑");
            String id = session.getId();
            Cookie cookie = new Cookie("JSESSIONID", id);
            cookie.setMaxAge(30 * 60);// 由于Session默认是 30 分钟失效,这里也设置成30 分钟
            response.addCookie(cookie);//这样就会覆盖掉原有的Cookie,下次服务器获取Session时,就会读取到该Cookie。

4、那Cookie被禁用以后怎么办?
session.getSession() 方法会从Cookie中查找SessionId ,如果Cookie被禁用,那么他会从url中查找SessionId,那么我们可以通过URL来传送 SessionId,

        String url1 = response.encodeURL("/JavaWebTest/SessionDemo?action=add");
            String url2 = response.encodeURL("/JavaWebTest/SessionDemo?action=show");

            writer.write("<a href='"+url1+"'>加入购物车</a>");
            writer.write("<a href='"+url2+"'>查看购物车</a>");

通过浏览器你会发现地址栏会多JSessionId
这里写图片描述

response.encodeURL()方法会判断如果getSession方法没有获取到Cookie那么,他会将SessionId附在URL地址后面。这总办法只能解决浏览器没有关闭情况下的Session共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值