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() + "");

}

}

猜你喜欢

转载自blog.csdn.net/qq_37878579/article/details/79145527
今日推荐