Cookie与Session(会话技术)

会话技术

会话技术:保存会话数据的技术,不同会话之间的数据是相互独立的,一次会话的多个请求之间数据是共享的。

一个会话的全过程

会话开启:客户端和服务端之间建立连接,会话开启
会话过程:一次会话期间,客户端和服务端之间可以有任意多次请求和响应
会话关闭:浏览器关闭了,会话就结束

Cookie(客户端的会话技术)简介

实质:Cookie是服务器给客户端,并存储在客户端的一份数据,也就是把会话数据保存在客户端的技术。

为什么要用Cookie

http协议是无状态协议,服务器不能记录浏览器的访问状态。客户端与服务器通讯的时候,客户端第一次访问后再次访问,服务器并不知道该客户端之前是否来访问过。而使用Cookie,浏览器第一次访问服务器(请求服务器),服务器会给浏览器一段数据(cookie),之后浏览器每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息识别浏览器身份并处理请求。

Cookie的简单使用

首先先创建Cookie对象,然后将Cookie信息发送给浏览器,浏览器收到Cookie后会自动保存,然后服务器可以在下次浏览器发送请求时读取Cookie信息。

流程测试

在这里插入图片描述
测试代码CookieTestServlet.java:

public class CookieTestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//创建一个Cookie对象
		Cookie cookie = new Cookie("username", "coder");
		//将Cookie对象放入response对象中,把Cookie信息发送给浏览器
		response.addCookie(cookie);
		
		
		//获取客户端带过来的cookie,通过request的getCookies()方法获取Cookie数组
		Cookie[] cookies = request.getCookies();
		if(cookies != null){
			for (Cookie c : cookies) {
				//获取cookie的名字
				String cookieName = c.getName();
				//获取cookie的键
				String cookieValue = c.getValue();
				System.out.println(cookieName + " = "+ cookieValue);
			}
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

浏览器第一次访问:http://localhost:8080/03_CookieTest/LoginServlet
查看响应报文,服务器会发送一个响应头(Set-Cookie)并以键值对的结构来设置数据,浏览器收到该数据后会把它保存到内存或硬盘中,这样就成功的向浏览器设置了一个Cookie
在这里插入图片描述

浏览器第二次访问:http://localhost:8080/03_CookieTest/LoginServlet
查看请求报文,当浏览器再次向服务器发送请求时会携带刚才那个Cookie数据,服务器就可以通过这个Cookie数据来判断浏览器状态了。
在这里插入图片描述

常用方法

添加Cookie给浏览器
		//创建一个Cookie对象
		Cookie cookie = new Cookie("username", "coder");
		//将Cookie对象放入response对象中,把Cookie信息发送给浏览器
		response.addCookie(cookie);
添加多个Cookie给浏览器
//创建两个Cookie对象
Cookie cookie1 = new Cookie("username", "coder");
Cookie cookie2 = new Cookie("password", "123456");

//将Cookie对象放入response对象中
response.addCookie(cookie1);
response.addCookie(cookie2);
读取浏览器中携带的Cookie
	//获取客户端带过来的cookie,通过request的getCookies()方法获取Cookie数组
		Cookie[] cookies = request.getCookies();
		if(cookies != null){
			for (Cookie c : cookies) {
				//获取cookie的名字
				String cookieName = c.getName();
				//获取cookie的键
				String cookieValue = c.getValue();
				System.out.println(cookieName + " = "+ cookieValue);
			}
		}
给Cookie赋新值
cookie.setValue(newValue);
//注意赋值后要将Cookie对象放入response对象中
response.addCookie(cookie);

设置cookie的有效期
/*
参数说明:
设置为0,setMaxAge(0)
   Cookie立即失效,下次浏览器发送请求将不会在携带该Cookie
设置大于0,setMaxAge(60)
   表示有效的秒数,如60就代表60秒后失效。
设置小于0,setMaxAge(-1)
   设置为负数表示当前会话有效,即关闭浏览器后Cookie失效
不设置
   如果不设置失效时间,则默认当前会话有效。
 */
cookie.setMaxAge(60);
Cookie的路径问题(Cookie的有效范围)
/*
   设置cookie的路径告诉浏览器在访问那个地址时才携带该cookie。

   如果不设置,默认会在访问"/项目名"下的资源时携带。
 */


	//用于指定只有请求了指定的域名,才会携带cookie
	cookie.setDomain(".baidu.com");
	//只有访问该域名下的CookieTestServlet的这个路径地址才携带cookie
	cookie.setPath("/CookieTestServlet");
		
/*
扩展:
    只有访问“/项目名/路径”下的的资源才会携带Cookie	
 	cookie.setPath("/项目名/路径") 
 */

删除浏览器的Cookie
//创建一个同name,同path的Cookie,设置有效期为0,然后发送到客户端。这样就会覆盖掉客户端同name同path的Cookie。
Cookie cookie = new Cookie("username", "");
cookie.setMaxAge(0);
response.addCookie(cookie);

Cookie案例

Cookie案例:获取上次登录时间
Cookie案例:显示商品浏览记录

Session(服务端的会话技术)简介

实质:Session是基于Cookie的一种会话机制。Cookie存放在客户端,Session存放在服务端。

Session的作用是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。

为什么要用Session

Cookie是服务器给客户端,并存储在客户端的一份数据。而使用Cookie有很多局限性,由于Cookie是保存在客户端的,所以存在信息安全问题,而且Cookie的大小与浏览器对Cookie数量都有限制。为解决这些问题,便引入了Session。

Session的简单使用

在登录界面,输入账号密码,提交后执行LoginServlet,执行相关逻辑,使用HttpSession接口的setAttribute()方法设置属性,保存账号与密码,再重定向跳转到showInfo.jsp,执行java代码片段,使用getAttribute()方法获取账号与密码,显示在页面上。
在这里插入图片描述

  • login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 	<form action="LoginServlet" method="post">
	用户名:<input type="text" name="user" ><br>
	密码:<input type="text" name="password"><br>
	<input type="submit" value="登录">
	</form>
</body>
</html>
  • LoginServlet.java
public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String user = request.getParameter("user");
		String password = request.getParameter("password");
		//返回与此请求相关联的当前会话,或者如果请求没有会话,则创建一个会话。
		HttpSession session = request.getSession();
		//控制台输出会话ID
		System.out.println(session.getId());
		
		session.setAttribute("username",user);
		session.setAttribute("password", password);
		response.sendRedirect("showInfo.jsp");	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
  • showInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	用户名:<%=session.getAttribute("username")%><br>
	密码:<%=session.getAttribute("password")%>
</body>
</html>

访问:http://localhost:8080/SessionTest/login.html

第一次访问,输入账号密码,提交
在这里插入图片描述

Session的创建时机是在request.getSession()方法第一次被调用时,Session被创建后,保存在服务器,同时还会有一个名为JSESSIONID的Cookie被创建,并传给浏览器。(下图响应行内容)

		//返回与此请求相关联的当前会话,或者如果请求没有会话,则创建一个会话。
		HttpSession session = request.getSession();
		session.setAttribute("username",user);
		session.setAttribute("password", password);
		response.sendRedirect("showInfo.jsp");	

在这里插入图片描述
重定向跳转到showInfo.jsp,请求内容携带了这个名为JSESSIONID的Cookie,在showInfo.jsp中执行java代码,显示出登录信息。(下图请求行内容)

<body>
	用户名:<%=session.getAttribute("username")%><br>
	密码:<%=session.getAttribute("password")%>
</body>

在这里插入图片描述
第二次访问,输入账号密码,提交(这是在当前会话中,且Cookie的默认时效就是当前会话)

上次访问Session被创建后,对应的Cookie被保存到浏览器中,之后浏览器每次访问项目时都会携带该Cookie。
在这里插入图片描述
扩展:如果Cookie中有JSESSIONID,但是JSESSIONID没有对应的Session存在,则会重新创建一个HttpSession对象,并重新设置JSESSIONID。

常用方法

	//(获取HttpSession对象)返回与此请求相关联的当前会话,或者如果请求没有会话,则创建一个会话。
	HttpSession session = request.getSession();

	//返回一个包含唯一标识符值的字符串(会话ID)。
	String id = session.getId();
	
	//存值
	session.setAttribute(name, value);
	
	//取值
	session.getAttribute(name);
	
	//移除值
	session.removeAttribute(name);
	
	//Session时效问题:Session对象默认的最长有效时间为30分钟
	//使此会话无效(强制失效),然后取消绑定到该对象的任何对象
    session.invalidate()

Session的活化和钝化

活化和钝化的理解|设置Session不使用自动钝化的时间

Session是一个域对象

各域对象作用范围

session的创建:一次会话开始

session自动销毁:

  1. 服务器(非正常)关闭,session销毁

  2. 会话超时,session自动销毁。默认30分钟,可以修改web.xml:

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

session手动销毁:session.invalidate()

session作用范围:在一次会话里(浏览器不关闭,不清除缓存),访问一个项目的任何资源,都可以共享数据

会话技术使用场景

验证码校验

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinking in Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值