JavaWeb基于session和cookie的数据共享

Posted 南阳客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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实现会话数据共享说明完毕,有不足的地方,希望大家多多提意见!

以上是关于JavaWeb基于session和cookie的数据共享的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb基础—会话管理之Cookie

JavaWeb:Cookie和Session

JavaWeb中Cookie和Session的讲解

javaWeb核心技术第八篇之Cookie和Session

JavaWeb 笔记总结

《遇见狂神说》Javaweb之cookie和session