会话技术的概述(Cookie和Session)

标签: session

会话技术的概述

会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程称为是一次会话。

会话技术分类

Cookie技术

Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样,web资源处理的就是用户各自的数据了。

Session技术

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


/**
 * 记录用户上次访问时间的Servlet
 */
public class VisitServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * 用户访问Servlet
		 * 	* 如果是第一次访问
		 * 		* 显示 您好,欢迎来到本网站
		 * 		* 记录当前访问时间,存入到Cookie,回写到浏览器
		 *  * 如果不是第一次访问
		 *  	* 从cookie中获得上次时间,显示到页面
		 *  	* 记录当前访问时间,存入到Cookie,回写到浏览器
		 */
		// 判断是否是第一次访问:从指定的Cookie的数组中获取指定名称的Cookie。
		// 获得从浏览器带过来的所有的Cookie:
		Cookie[] cookies = request.getCookies();
		// 从数组中找到指定名称的Cookie:
		Cookie cookie = CookieUtils.findCookie(cookies, "lastVisit");
		// 判断是否是第一次访问:
		if(cookie == null){
			// 是第一次访问
			// 显示到页面上一段内容:
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter().println("<h1>您好,欢迎来到本网站!</h1>");
		}else{
			// 不是第一次访问
			// 获得cookie中的上次访问时间,显示到页面
			String value = cookie.getValue();
			// 显示到页面上一段内容:
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter().println("<h1>您好,您的上次访问时间为:"+value+"</h1>");
		}
		// 记录当前系统时间存入到Cookie,回写到浏览器
		Date d = new Date();
		// 存入到Cookie:
		Cookie c = new Cookie("lastVisit",d.toLocaleString());
		// 给Cookie设置有效路径
		c.setPath("/web03");
		// 给Cookie设置有效时长
		c.setMaxAge(60 * 60); // 设置有效时长为1小时
		// 回写到浏览器:
		response.addCookie(c);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
	{
		doGet(request, response);
	}

 

Cookie的分类

默认级别的Cookie

指的是没有设置有效时间的Cookie,默认的情况下只要关闭了浏览器,Cookie也会被销毁。(Cookie存在于浏览器的内存中,当关闭了浏览器Cookie就销毁了)。

持久级别的Cookie

指的是有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,将Cookie的内容保存(持久化)到硬盘上。这个时候,关闭浏览器,再次打开浏览器会加载硬盘上的文件,从而Cookie中的数据就不会丢失。

Cookie的使用细节

Cookie的使用细节总结

  • 一个Cookie只用标识一种信息,至少含有一个标识该信息的名称和值。
  • 一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。-----浏览器存放的Cookie的大小和个数是有限制的。
  • 如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调用setMaxAge(int maxAge)方法,以秒为单位的。
  • 需要手动删除持久性Cookie,可以将Cookie的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。

Session的概述

什么是Session

Session称为是一次会话,Cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时候,服务器程序可以将用户数据写到session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。

为什么有Cookie还要有Session

  • Cookie局限性:
    • Cookie保存的数据是有个数和大小的限制的。
    • 数据是保存客户端浏览器上(相对不是很安全)。
  • Session
    • Session没有个数和大小限制。
    • 数据是保存在服务器上(相对比较安全)。

Session的实现原理

Session作为域对象的作用范围

Session作为域对象,作用范围就是一次会话的范围。一次会话,指的是用户打开浏览器点击多个超链接,访问服务器资源,到最后关闭浏览器的过程。

Servlet的域对象的总结

请求范围(ServletRequest)

  • 何时创建和销毁的
    • 创建:当用户向服务器发送一次请求,服务器创建一个request对象。
    • 销毁:当服务器对这次请求作出了响应,服务器就会销毁这个request对象。
  • 如何存取数据
    • 存数据:
      • void setAttribute(String name,Object value);
    • 取数据
      • Object getAttribute(String name);
  • 作用范围
    • 作用范围:一次请求。(转发就是一次请求)。

会话范围(HttpSession)

  • 何时创建和销毁的
    • 创建:服务器端第一次调用getSession()方法的时候。
    • 销毁:三种情况。
      • Session过期,默认的过期时间30分钟(web.xml中配置)。
      • 非正常关闭服务器。(正常关闭服务器—session会被序列化)。
      • 手动调用session.invalidate();
  • 如何存取数据
    • 存数据:
      • void setAttribute(String name,Object value);
    • 取数据
      • Object getAttribute(String name);
  • 作用范围
    • 作用范围:一次会话(多次请求)

应用范围(ServletContext)

  • 何时创建和销毁的
    • 创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。
    • 销毁:服务器关闭的时候,或者项目从服务器中移除的时候。
  • 如何存取数据
    • 存数据:
      • void setAttribute(String name,Object value);
    • 取数据
      • Object getAttribute(String name);
  • 作用范围
    • 作用范围:整个应用

session验证码

public class LoginServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try{
			// 1.接收数据
			// 处理中文乱码
			request.setCharacterEncoding("UTF-8");
			String username = request.getParameter("username");
			String password = request.getParameter("password");
			// 一次性验证码的校验
			// 接收验证码
			String checkcode1 = request.getParameter("checkcode");
			// 从session中获取一次性验证码的值:
			String checkcode2 = (String) request.getSession().getAttribute("checkcode");
			// 为了保证验证码使用一次:应该将session中的验证码值清空
			request.getSession().removeAttribute("checkcode");
			// 校验一次性验证码:
			if(!checkcode1.equalsIgnoreCase(checkcode2)){
				request.setAttribute("msg", "验证码输入错误!");
				request.getRequestDispatcher("/login.jsp").forward(request, response);
				return;
			}
			
			// 2.封装数据
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			// 3.处理数据
			UserModel userModel = new UserModel();
			User existUser = userModel.login(user);
			// 4.页面跳转
			if(existUser == null){
				// 登录失败
				// 向request域中保存一个错误信息:
				request.setAttribute("msg", "用户名或密码错误!");
				// 使用请求转发进行页面跳转
				request.getRequestDispatcher("/login.jsp").forward(request, response);
			}else{
				// 登录成功
				// 保存用户的信息:保存到会话当中。
				HttpSession session = request.getSession();
				// 保存数据:
				session.setAttribute("existUser", existUser);
				// 记住用户名:
				// 判断复选框是否已经勾选了:
				String remember = request.getParameter("remember");
				if("true".equals(remember)){
					// 已经勾选了:
					Cookie cookie = new Cookie("remember",existUser.getUsername());
					// 设置有效路径:
					cookie.setPath("/web03_login");
					// 设置有效时长:
					cookie.setMaxAge(60*60*24);
					// 将Cookie回写到浏览器
					response.addCookie(cookie);
				}
				// 重定向到成功页面
				response.sendRedirect("/web03_login/success.jsp");
			}
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

 

 

 

 

原文链接:加载失败,请重新获取