博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb基于session和cookie的数据共享
阅读量:5174 次
发布时间:2019-06-13

本文共 4254 字,大约阅读时间需要 14 分钟。

         在了解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);// 设置pathcookie.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实现会话数据共享说明完毕,有不足的地方,希望大家多多提意见!

转载于:https://www.cnblogs.com/nanyangke-cjz/p/7143799.html

你可能感兴趣的文章
从ECMA到W3C
查看>>
软件工程--第十六周学习进度
查看>>
yii2 ActiveRecord多表关联以及多表关联搜索的实现
查看>>
搜狗输入法安装--ubuntu
查看>>
ps/2接口键盘的输入及显示
查看>>
Swift———a Glance(极客学院)笔记
查看>>
【poj3294-不小于k个字符串中最长公共子串】后缀数组
查看>>
java如何获取其它用户登录的真是IP地址
查看>>
Jquery通过指定层次关系获取元素
查看>>
c# for 和 foreach 的区别
查看>>
docfx (一)
查看>>
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
查看>>
深度学习之前馈神经网络(前向传播和误差反向传播)
查看>>
IEnumerable<T>和IQueryable<T>区别
查看>>
(转)MFC界面风格
查看>>
Centos7 tmux1.6 安装
查看>>
二叉树(三)
查看>>
linux加密文件系统 fsck 无法修复一例
查看>>
【linux配置】VMware安装Redhat6.5
查看>>
AI自主决策——有限状态机
查看>>