• JavaWeb基于session和cookie的数据共享


             在了解session和cookie技术之前,我们需要先了解一下什么是会话?会话可以简单理解为用户打开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程称为一个会话。这样,在一次会话过程中,用户在访问web资源的过程中,各自产生了一些数据,那么用户如何来保存这些数据呢?举个简单例子,假如我们的网站是一个购物的网站,如果用户点击了购买的servlet的之后产生了一条购买的商品数据,这个数据应该存到哪里呢?那么当该用户点击付款servlet的时候,又从哪里去获取上次购买之后产生的商品数据呢?对于这个问题的结果,我们有两种解决方案,那就是基于cookie的客户端会话保存技术,和基于服务端的会话保存技术。

    1.cookie技术

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

    ②cookie实现会话数据共享原理图:

     ③基于cookie技术实现显示用户上一次访问网站的时间,示例代码如下所示:

    package com.servlet;
    
    import java.io.IOException;
    import java.util.Date;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 基于session的回显上次访问时间的案例
     * 
     * @author Administrator
     *
     */
    @WebServlet("/slad.do")
    public class ShowLastAccessDateServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 涉及到中文,解决下乱码问题
            response.setCharacterEncoding("UTF-8");
            // 告诉浏览器以什么方式和编码打开
            response.setContentType("text/html; charset=UTF-8");
            // 1.回写上次的访问时间
            Cookie[] cookies = request.getCookies();
            for (int i = 0; cookies != null && i < cookies.length; i++) {
                if (cookies[i].getName().equals("lastAccessTime")) {
    
                    Date date = new Date(Long.parseLong(cookies[i].getValue()));
                    response.getWriter().print("您上次的访问时间是:" + date.toLocaleString());
                }
            }
    
            // 2.记录下这次的访问时间
            Cookie dateCookie = new Cookie("lastAccessTime", System.currentTimeMillis() + "");
            // 设置cookie的有效时间,单位为秒,这里设置一个月
            dateCookie.setMaxAge(30 * 24 * 3600);
            // 设置那些url地址访问有效,这里设置是整个项目访问都有效
            dateCookie.setPath("/JavaWebDemo/");
            // 加入到response中
            response.addCookie(dateCookie);
        }
    
    }

    2.session技术

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

    ②session的实现原理是基于cookie机制的,如下图所示:

    ③因为服务器在创建session的时候,写给浏览器的cookie是没有设置有效期,所以当用户把浏览器关了之后,那么当用户重新带开浏览器访问我们的项目的时候,cookie不存在了,所以之前存到session中的数据无法取到了,要保持原来的session有效,不让数据丢失,我们可以自己手动创建一个和session写给浏览器一摸一样的cookie只是多了个有效期而已,这样就能够解决浏览器关闭之后,再次打开浏览器,就能访问到之前存到session中的数据了,示例代码如下所示:

    // 获取session对象
    HttpSession session = request.getSession();
    // 重写cookie返回给浏览器
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    // 设置有效期,时间为秒
    cookie.setMaxAge(30 * 60);
    // 设置path
    cookie.setPath("/JavaWebDemo");
    // 加入到response对象中
    response.addCookie(cookie);

    ④session实现会话数据共享原理图:

     

     

     ⑤基于session技术实现显示用户上一次访问网站的时间,示例代码如下所示:

    package com.servlet;
    
    import java.io.IOException;
    import java.util.Date;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     * 基于cookie的回显上次访问时间的案例
     * 
     * @author Administrator
     *
     */
    @WebServlet("/slat.do")
    public class ShowLastAccessTimeServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 涉及到中文,解决下乱码问题
            response.setCharacterEncoding("UTF-8");
            // 告诉浏览器以什么方式和编码打开
            response.setContentType("text/html; charset=UTF-8");
            // 1.回写上次的访问时间,这里面设置了false,代表当没有session的时候,不重新创建session
            HttpSession session = request.getSession(false);
            if (session != null && session.getAttribute("lastAccessTime") != null) {
                Date date = new Date(Long.parseLong(session.getAttribute("lastAccessTime").toString()));
                response.getWriter().print("您上次的访问时间是:" + date.toLocaleString());
            }
    
            // 2.记录下这次的访问时间
            request.getSession().setAttribute("lastAccessTime", System.currentTimeMillis() + "");
    
        }
    
    }

     至此,一个简单cookie和session实现会话数据共享说明完毕,有不足的地方,希望大家多多提意见!

  • 相关阅读:
    一个matlab小程序:挑出沪市A股年报与一季度报在同一天发布的股票
    AWK
    matlab搜索路径
    从新浪财经上下载交易明细数据并统计每天的买卖笔数(shell 命令行)
    AWK截取字符串
    tar GNU
    工作效率上的错觉(转载)
    matlab双精度浮点数编码及区间覆盖(原创)
    DNS服务器设置(Ubuntu10.04)
    sed
  • 原文地址:https://www.cnblogs.com/nanyangke-cjz/p/7143799.html
Copyright © 2020-2023  润新知