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