8-session和cookie

什么是会话?

用户打开一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一个会话

HTTP协议是一种"无状态"协议,客户浏览器与服务器建立连接,发出请求,得到响应,然后关闭连接,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。所以容器不能辨认下一个请求和之前的请求是不是同一个请求,对于容器而言,每个请求都是新的。

使用浏览器与服务器进行会话的过程中,不可避免会产生一些数据, Web服务器没有短期记忆,如何保存这些用户数据?

cookie

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

一个cookie只能保存一个信息;一个web站点可以给浏览器发送多个cookie;不设置cookie有效期时,关闭浏览器,cookie会自动失效

下面的例子是,第一次访问会创建cookie,保存访问时间,并发给浏览器。下次访问时,如果有cookie就直接输出上次保存的时间

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //一定要注意顺序, 编码设置一定要在  PrintWriter 对象创建 之前,否则无效!
        resp.setContentType("text/html;charset=utf-8");
        //响应输出
        PrintWriter out = resp.getWriter();
        //获得请求的cookies数组
        Cookie[] cookies = req.getCookies();
        //有数据就读取
        if(cookies!=null){
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if(cookie.getName().equals("yuan")){
                    Long value = Long.valueOf(cookie.getValue());
                    String s = new Date(value).toString();
                    out.println(s);
                }
            }
        }else{
            out.write("您是第一次来本网站");
        }
        //添加cookie
        String value = String.valueOf(System.currentTimeMillis());
        Cookie cook = new Cookie("yuan", value);
        //设置客户端cookie存活的寿命
        cook.setMaxAge(3600);
        resp.addCookie(cook);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

session

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,这个session对象储存在服务器中。由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

具体实现上,客户的第一次请求,容器会生成一个唯一的会话ID,且一般通过cookie把它发回客户端,客户在以后的每一个请求中发回这个会话ID。容器看到后,就会找到匹配的会话,并把这个会话与请求关联。

session的中文就是会话,因此一般对于session有两种理解,一种是抽象理解,即最开始会话的概念,一种是保存数据的具体实现,即这个模块。

可以获取session的id,设置session属性,检测session是不是新创建的

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //获得session
        HttpSession session = req.getSession();
        //获得swssionid
        String id = session.getId();
        //存储数据
        session.setAttribute("name","原");
        //输出
        PrintWriter writer = resp.getWriter();
        if(session.isNew()){
            writer.write("创建成功"+id);
        }else{
            writer.write("已经存在"+id);
        }
    }

可以获取session中存储的属性

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        HttpSession session = req.getSession();
        String name = (String)session.getAttribute("name");
        System.out.println(name);
    }

可以移除session中的属性、清除session

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //清除此session
        session.invalidate();
    }

注意:
1、session 在服务器端,cookie 在客户端(浏览器)
2、cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

文字部分参考:
作者:技能树IT修真院
链接:https://www.zhihu.com/question/19786827/answer/661441746

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值