• 5.Servlet的Cookie和Session


    一.会话

    两种技术:

    • Cookie:客户端技术

    • Session:服务器技术

    常见应用:网站登录之后下一次就可以不再登录。

    1.Cookie

    使用步骤:

    1. 服务器从客户端获取cookie信息

    2. 服务器设置cookie信息返回给客户端

    Cookie案例:服务器获取并设置cookie

     1 public class CookieDemo01 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         req.setCharacterEncoding("utf-8");
     6         resp.setCharacterEncoding("utf-8");
     7         resp.setContentType("text/html; charset=utf-8");
     8 
     9         PrintWriter out = resp.getWriter();
    10 
    11         //服务器从客户端获取cookie
    12         Cookie[] cookies = req.getCookies();
    13 
    14         if (cookies != null) {
    15             out.write("你上一次访问的时间是:");
    16 
    17             for (int i = 0; i < cookies.length; i++) {
    18                 Cookie cookie = cookies[i];
    19 
    20                 //判断cookie的名字
    21                 if (cookie.getName().equals("lastLoginTime")) {
    22                     //获取cookie的值
    23                     long lastLoginTime = Long.parseLong(cookie.getValue());
    24 
    25                     Date date = new Date(lastLoginTime);
    26 
    27                     out.write(date.toLocaleString());
    28                 }
    29             }
    30         } else {
    31             out.write("这是您第一次访问");
    32         }
    33 
    34         //服务器给客户端响应一个cookie
    35         Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
    36 
    37         //设置cookie的有效期为1天
    38         cookie.setMaxAge(24 * 60 * 60);
    39         resp.addCookie(cookie);
    40     }
    41 
    42     @Override
    43     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    44         doGet(req, resp);
    45     }
    46 }

    cookie常用函数:

    1 Cookie[] cookies = req.getCookies(); //获取cookie
    2 cookie.getName();                   // 获取cookie的key
    3 cookie.getValue();                  //获取cookie的value
    4 new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建一个cookie
    5 cookie.setMaxAge(24 * 60 * 60);     //设置cookie的有效期
    6 resp.addCookie(cookie);             //浏览器返回给客户端一个cookie

    注意事项:

    1. 一个Cookie只能保存一个信息

    2. 一个web站点可以给浏览器发送多个cookie但是最多存放20个cookie

    3. Cookie大小限制为4kb

    4. 300个cookie是浏览器的上限

    删除Cookie:

    • 方法1:不设置cookie的有效期,关闭浏览器后cookie自动失效

    • 方法2:设置浏览器有效期为0

    删除cookie时,必须先建立一个和需要删除的cookie有一样的键值的cookie

    1 //服务器给客户端响应一个cookie
    2 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
    3 
    4 //设置cookie的有效期为1天
    5 cookie.setMaxAge(24 * 60 * 60);
    6 resp.addCookie(cookie);

    对于中文乱码问题:使用编码和解码

    1 cookie = new Cookie("name",URLEncoder.encode("你好!","utf-8"))
    2 out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));

    2.Session(重点)

    (1)什么是Session

    • 服务器会给每一个用户(浏览器)创建一个Session对象

    • 一个session独占一个浏览器,只要浏览器没有关闭,这个Session就一直存在

    • 用户登录之后,整个网站都可以访问这个Session(用于保存用户信息,保存购物车的信息)

    (2)Session和cookie的区别

    • Cookie:服务器将数据保存在浏览器上,浏览器保存,可创建多个

    • Session:服务器将数据保存在服务器上用户独占Session,只有一个

    (3)Session的使用场景

    • 保存一个登录用户的信息

    • 保存购物车信息

    • 保存在整个网站中经常使用的数据

    (4)使用:

    SessionDemo01:获得和设置Session

     1 public class SessionDemo01 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         //解决中文乱码问题
     6         req.setCharacterEncoding("utf-8");
     7         resp.setCharacterEncoding("utf-8");
     8         resp.setContentType("text/html; charset=utf-8");
     9 
    10 
    11         //得到Session
    12         HttpSession session = req.getSession();
    13 
    14 
    15         //设置Session
    16         session.setAttribute("name",new Person("小王",24));
    17 
    18         //获取Session的ID
    19         String sessionId = session.getId();
    20 
    21         //判断session是不是新建的
    22         if (session.isNew()){
    23             resp.getWriter().write("session创建成功,ID:"+sessionId);
    24         }else{
    25             resp.getWriter().write("session已经在服务器中存在,ID:"+sessionId);
    26         }
    27 
    28 
    29 
    30     }
    31 
    32     @Override
    33     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    34         doGet(req, resp);
    35     }
    36 }

    SessionDemo02:跨Servlet访问Session

     1 public class SessionDemo02 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5 
     6         //解决中文乱码问题
     7         req.setCharacterEncoding("utf-8");
     8         resp.setCharacterEncoding("utf-8");
     9         resp.setContentType("text/html; charset=utf-8");
    10 
    11         //得到Session
    12         HttpSession session = req.getSession();
    13 
    14         Person person = (Person) session.getAttribute("name");
    15 
    16         resp.getWriter().write("获得person:" + person);
    17     }
    18 
    19     @Override
    20     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    21         doGet(req, resp);
    22     }
    23 }

    SessionDemo03:手动删除Session

     1 public class SessionDemo03 extends HttpServlet {
     2 
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         HttpSession session = req.getSession();
     6 
     7         session.removeAttribute("name");
     8 
     9         //手动注销Session:注销之后就没有之前的那个Session但是会立即创建一个新的Session
    10         session.invalidate();
    11     }
    12 
    13     @Override
    14     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    15         doGet(req, resp);
    16     }
    17 }

    也可以在web.xml中设置Session的自动失效时间

    1 <!--设置15分钟后Session自动失效-->
    2 <session-config>
    3   <session-timeout>15</session-timeout>
    4 </session-config>
  • 相关阅读:
    理解Unity3d的ForceMode | Understanding ForceMode in Unity3D
    Jexus 网站服务器和 ASP.NET 跨平台开发
    ASP.NET 5 改名 ASP.NET Core 1.0
    计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件)
    分布式系统与集群区别
    网站缓存技术(Redis、Memcached、Ehcache)
    Node.JS
    深入浅出Node.js(一):什么是Node.js
    让我欲罢不能的node.js
    为什么我要用 Node.js? 案例逐一介绍
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12310376.html
Copyright © 2020-2023  润新知