Java Web 之 Cookie 和 Session 详解

本贴最后更新于 1500 天前,其中的信息可能已经沧海桑田

Java Web 之 Cookie 和 Session 详解

我们知道 http 协议是无状态的,也就是说就算客户端是第二次访问服务器,服务器还是把此次访当做一个新的访问进行处理,因为服务端并不知道客户端之前是否访问过。而 cookie 和 session 则就是为了弥补这一缺陷出现的一种机制。


Cookie 为服务器给客户端的数据, 可以让服务器清楚的知道该客户端是否访问过自己
常用方法

Cookie cookie = new Cookie("name", value);//创建一个名为name, 值为value的cookie
cookie.setMaxAge(1*60*60*24);//cookie存在在本地的有效时长(单位为秒) 默认为-1  表示页面关闭cookie就失效
cookie.setDomain("");//设置在某个域名下生效
cookie.setPath("/login.jsp");//设置访问该域名下某个路径时生效
cookie.setMaxAge(0);//cookie中的account
response.addCookie(cookie);//添加到response, 相当于服务器创建一个cookie并将之给客户端

 Cookie[] cookies=request.getCookies();//获取cookies 
 cookie.getName();//cookie的name
 cookie.getValue();//cookie的value
  • 利用 cookie 实现一个记住网站登陆时间的小 demo
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        Cookie[] cookies = req.getCookies();
        if(cookies != null){
            // 如果存在
            out.write("你上一次访问的时间是:");
            for (int i=0;i<cookies.length;i++) {
                if(cookies[i].getName().equals("lastLoginTime")){//获取cookie的名字
                    long lastTime = Long.parseLong(cookies[i].getValue());  // 把字符串解析为长整型 把字符串转为时间戳
                    Date date = new Date(lastTime);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.write("这是你第一次访问本网站!");
        }
        // 服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        resp.addCookie(cookie);
    }

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

Session

  • 服务器会给每个用户(浏览器)创建一个 session 对象
  • 一个 session 独占一个浏览器, 只要浏览器没关, session 就会一直存在
  • 通常用来保存用户信息, 既可以保存数据, 也可以保存一个对象

session 的用法

resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        // 得到session
        HttpSession session = req.getSession();
        // 给session中存东西
        session.setAttribute("name","wuhobin");  //可以存数据
        session.setAttribute("person",new Person("wuhobin","123",20));  // 也可以存一个对象
        String id = session.getId();
        // 判断session是不是新创建的
        if(session.isNew()){
            resp.getWriter().write("session创建成功,id:"+id+","+session.getAttribute("name"));
            resp.getWriter().write(session.getAttribute("person").toString());
        }else {
            resp.getWriter().write("session已经存在,id:"+id+","+session.getAttribute("name"));
            resp.getWriter().write(session.getAttribute("person").toString());
        }

session 注销

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        session.removeAttribute("person");
        // 手动注销session
        session.invalidate();
    }

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

通过 web.xml 来注销

<!--  设置session默认的消失时间  -->
    <session-config>
<!--   15分钟后session自动消失     -->
        <session-timeout>15</session-timeout>
    </session-config>
  • Cookie
    21 引用 • 63 回帖
  • Session
    14 引用 • 6 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • PeterChu 1 评论

    关于 session 有效时间设置:

    设置 session 的有效时间

    第三种设置方式:tomcat --> conf --> web.xml 中找到

    <session-config>
      <session-timeout>30</session-timeout>
    </session-config>
    

    以上设置 session 的有效时长优先级为:编程式 > 声明式 >tomcat 设置式

    有点好奇优先级,然后就去查了下.
    PeterChu