Java Web 之 Cookie 和 Session 详解

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖

相关帖子

欢迎来到这里!

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

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

    关于 session 有效时间设置:

    设置 session 的有效时间

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

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

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

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