会话技术与应用

本文探讨了HTTP无状态协议下的会话技术,包括Cookie和Session的使用。讲解了Cookie的定义、作用、分类和作用场景,强调了拼接内容时的注意事项。同时,深入解析了Session的概念、实现方式、API以及与Cookie的比较。还讨论了Session在关闭浏览器后失效的原因,并给出了ServletContext在Web应用中的角色和核心方法。最后,提供了购物车功能的Session和Cookie应用案例。
摘要由CSDN通过智能技术生成

会话技术(Cookie和Session)

  • 引入: Http协议是一种 无状态 的协议。

域模型对象(Servlet )–request,session,servletContext

  • ​ request 只能在当前请求中获取到数据
    • eg: 开启一个浏览器,一次请求(提交)存储数据后,请求结束存储的数据消失
  • ​ session 在当前session存活期间都可以读取到数据
    • 暂时理解:客户端A与服务器S的session会话内容只能A,S俩访问,客户端B无法访问,A 与服务器S的内容
    • eg:开启一个浏览器,多次请求(提交)存储数据,存储的数据可被访问,直到关闭浏览器为止
  • ​ servletContext
    • eg: 全局变量。只要Web应用在启动中(服务器不关闭),数据一直存在。存储的数据可被所有用户访问。

Cookie

  • Cookies 定义

    • 概念

      • 记录一些客户端相关的信息 大小不能超过4kb
    • 作用,存储位置

      • 在浏览器中,经常涉及到数据交换, 储存在浏览器
    • 注意:

      • 当第一次创建Cookie的值为空时,则不会创建Cookie
    • 常用方法

      Cookie  cookie=new Cookie(name,value);//创建一个cookie
      response.addCookie(cookie);//通过响应对象返回给客户端浏览器cookie
      Cookies cs[]=request.getCookies();//获得所有的cookies   返回值是一个数组
      
  • Cookie的属性

属性名含义
namecookie的名字
value对应name的值
path表示当前哪个路径 哪个请提可以携带cookie 必须以 / 开头
domain表示的是域名 指定了哪一些域名是可以访问cookie的 默认是localhost
comment表示当前cookie的说明 注释
Secure表示当前cookie是否只使用https传输 作用:在一定程度上提高 确定 安全性。
isHttpOnly表示cookie是否只用于传输 而不被js修改。
version表示版本
Maxagecookie的生存时间

分类:

说明:cookie的生存时间是由 MaxAge 属性决定的

  • 临时cookie

    MaxAge = -1

  • 持久cookie

    MaxAge =Integer.MAX_VALUE; 永不过期

    MaxAge=60×60×24×7 表示cookie60秒后过期

    MaxAge =0 表示立即过期

Cookie作用场景

  1. 购物车
  2. 记住密码

拼接Cookie内容时需注意:

Cookie Version 0中,某些特殊的字符(如下),不能作为Cookie的内容
例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号。

Session

  • 概念
    • 指的是服务器和浏览器之间的 一次会话, 会话指的是多次请求和响应的过程。

session的三种实现方式:

  • 基于cookie的实现方式

  • 重写url(第一种方式禁用cookie 的情况下

    • http://localhost:8080/day1112/testSession;JSESSIONID=3E416CBB052F21BB6340E40574511A78
  • 隐藏form表单

    • <form method="" action="">
      <input type="hidden" name="JSESSIONID"  value="3E416CBB052F21BB6340E40574511A78">
      

Session API

方法名返回值类型意义
request.getSession(true);HttpSessionsession 的获取和创建:
true和不写情况下:
1>如果有旧的session就用旧的session
2>如果没有已经存在的session,创建一个新的session
false的情况下:
1>没有已经存在的session就返回null
2> 如果有旧的session就用旧的session
session.setAttribute(“name”, “zs”);Object在session对象中存值
session.setMaxInactiveInterval(1800);void设置最大空闲时间设置 0或者负数 表示永不过期
session.getMaxInactiveInterval();int获得session的最大空闲时间
session.getCreationTime();longsession的创建时间
session.getId()String获得session的Id
session.getLastAccessedTime();longlastAccessedTime
session.isNew()boolean判断session是否是新建
session.invalidate();voidsession立即失效的方法

Session 和 Cookie的比较

SessionCookie
用户数据保存在服务器端 相对安全用户数据保存在客户端,相对于session不安全
数据类型不限数据类型为字符串
数据大小不限数据大小4kb
占用服务器内存占用历览器内存

记住密码案例(前端,后台)

  • 前端:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	window.onload=function() {
		var x=document.cookie;//获取前端Cookie值
		//console.log(x);
		//if (x=="") console.log(x+"1");
		if(x!=null&&x!=""){//判断一下预防报错		
				var an=x.split("&");//切割Cookie 
				var u=an[0].trim().substring("user=".length);//字符串截取
				var p=an[1].trim();//去掉前后空格
				var r=an[2].trim();
				//赋值
				document.getElementsByTagName("input")[0].value=u;
				document.getElementsByTagName("input")[1].value=p;
				if(r==1)
					document.getElementsByTagName("input")[2].checked=true;
		}
	}
</script>
</head>
<body>
<fieldset style="width:300px; height: 60px;">
<form action="login" method="get">
	用户名:<input type="text" name="user" placeholder="请输入用户名"><br>
	密码:<input type="password" name="pwd" placeholder="请输入密码"><br>
	<label>
		<input type="checkbox" name="rember"  value="1" >记住密码
	</label>
	<input type="submit" value="提交">
</form>
</fieldset>
</body>
</html>
  • 后台
package com.team5101.servlets;

import java.io.IOException;

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;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

	@Override
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html:charset=utf-8");
		String user = request.getParameter("user");
		String pwd  = request.getParameter("pwd");
		String rem = request.getParameter("rember");
		if("bggl".equals(user)&&"123456".equals(pwd)) {
				if("1".equals(rem)) {//已勾选记住密码
					SetCookie(user,pwd,request,response);
				}
				else {//未勾
					Cookie c=new Cookie("user","");
					c.setMaxAge(0);
					response.addCookie(c);
				}
				response.sendRedirect("success.html");
		}
		else {
			response.sendRedirect("login.html");
			System.out.println("密码错误");
		}
		
	}

	public static  void SetCookie(String user, String pwd,HttpServletRequest request,HttpServletResponse response) {
			String value=user+"&"+pwd+"&1";
			CreateCookie(value,response);//cookie覆盖
	}
	public static void CreateCookie(String value,HttpServletResponse response) {
		Cookie c=new Cookie("user",value);
		c.setMaxAge(60*60*24*3);//3天
		System.out.println("Cookie-创建成功!时效:"+(c.getMaxAge()/3600/24)+"天 ");
		response.addCookie(c);
	}

}

为什么关闭浏览器session会失效

  • session创建方式:
    • 因为默认情况下,当getSession()后,session就被被创建。session在创建时,服务器会通过Cookie返回session 的ID给浏览器,之后服务器根据浏览器Cookie里的session的ID来分辨不同用户。
  • session失效的原因
    • 这种方法返回的cookie是保存在浏览器的内存中,浏览器关闭后内存会被清理,所以在session在关闭浏览器后就失效了。虽然在服务器保存的session会在在有效期后才会被销毁,但是用户的cookie里没有session的ID,服务器就不能判断出当前用户是否是原先的那个用户。

ServletContext

  • 含义

域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据。

  • 域对象方法

    凡是域对象都有如下3个方法:

    setAttribute(name,value);
    name是String类型,value是Object类型;
    往域对象里面添加数据,
    添加时以key-value形式添加
    getAttribute(name);根据指定的key读取域对象里面的数据
    removeAttribute(name);根据指定的key从域对象里面删除数据
核心方法
  • getServletContext().getRealPath(path),根据相对路径获取服务器上资源的绝对路径
  • getServletContext().getContextPath();获取当前工程名字

Session 和cookie应用案例–购物车思路

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值