JavaWeb笔记之Cookie&Session会话技术

Cookie&Session

	会话:
	是指一个客户端/浏览器与web服务器之间连续发生的一系列请求和响应的过程,会话技术也可以说成服务器跟踪用户信息的技术
	客户端/浏览器会话技术:Cookie
	服务器端会话技术:Session

什么是Cookie

Cookie是一种会话技术,用于将会话过程中的数据保存在用户的浏览器中,方便浏览器和服务器更好的进行数据交互

​ 当你(客户端)去理发店(服务器端)理发时,理发店让你办一张会员卡,这个会员卡(Cookie)会记录的你的一些数据比如姓名手机号,存入卡片金额等,你接收了这张卡片,以后再来理发直接使用这张会员卡。这样就直接简化了你的操作
​ 会员卡由理发店产生,经理发店发送到用户手里,以后用户访问理发店带着会员卡
​ 同样,客户端/浏览器发送请求到服务器,与服务器建立会话,服务器会生成Cookie返回给客户端,当用户第二次访问服务器时,浏览器会携带Cookie(存在于请求头中)发送到服务器,方便服务器做出正确响应。

在这里插入图片描述

Cookie的一些方法

Cookie类的构造方法

/*
	name用于指定Cookie的名称,value用于指定Cookie的值
	Cookie一但创建name不可更改,value可以更改
*/
public Cookie(String name, String value){
		validation.validate(name);
        this.name = name;
        this.value = value;
}

Cookie的常用方法

方法声明功能描述
String getName()返回Cookie的名称
void setValue(String newValue)用于为Cookie设置新的值
String getValue()返回Cookie的值
void setMaxAge(int expiry)设置Cookie在浏览器的存活秒数
int getMaxAge()返回Cookie在浏览器的存活秒数
void setPath(String uri)设置该Cookie项的有效目录路径
String getPath()返回该Cookie项的有效目录路径
void setDomain(String pattern)设置Cookie项的有效域
String getDomain()返回Cookie项的有效域
  • void setMaxAge(int expiry) 注意:

      		当设置的值为正数时代表Cookie会被持久化到本地的硬盘上,
      		在设置的时间内,重启浏览器依然保持有效,超过这个秒数,cookie会自动删除;
      		当设置的值为负数时代表关闭浏览器Cookie会被自动删除,默认的也是这个;
      		当设置的值为0时,表示通知浏览器立即删除这个Cookie
    
  • void setPath(String uri):设置cookie的有效目录路径

      		一个服务器中部署了多个web项目,那么在这些web项目中cookie能不能共享?
      		默认情况下cookie不能共享,仅对当前虚拟路径及其子目录子目录有效
      		如果需要共享,将uri设置为"/"
    
  • void setDomain(String pattern):设置Cookie项的有效域

      		不同的tomcat服务器间cookie共享问题?
      		如果设置一级域名相同,那么多个服务器之间cookie可以共享
      		默认情况下,domain的属性值为当前主机名,domain的属性值不区分大小写;
      		设置domain的属性值必须以"."开头
      		setDomain(".baidu.com"),那么在tupian.baidu.com和zhidao.baidu.com中cookie可以共享
    
  • 使用Cookie的步骤

      		1. 创建Cookie对象,绑定数据
      		 new Cookie(String name, String value)
      		2. 发送Cookie对象
      			 response.addCookie(Cookie cookie)
      		3. 获取Cookie,拿到数据
      			Cookie[]  request.getCookies()
    

案例:显示用户上次的访问时间

注意: 在tomcat8之后,Cookie可以设置中文数据,但是不支持特殊字符, yyyy年MM月dd日 HH:mm:ss中有一个空格,需要进行URL编码, 否则会报异常或者500的状态码, 取出value(时间)后, 再进行URL解码即可

	package com.ligong.cookie;
	
	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 java.io.IOException;
	import java.net.URLDecoder;
	import java.net.URLEncoder;
	import java.text.SimpleDateFormat;
	import java.util.Date;
	
	@WebServlet("/cookieTest")
	public class CookieTest3 extends HttpServlet {
	    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	        this.doPost(request, response);
	    }
	
	    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	        //设置服务器输出内容的编码方式为UTF-8,防止乱码
	        response.setContentType("text/html;charset=utf-8");
	        String value = null;
	        //获取所有Cookie
	          Cookie[] cookies = request.getCookies();
	        if (cookies!=null && cookies.length>0) {
	            for (Cookie cookie : cookies) {
	            //如果找到lastTime就把他取出来进行URL解码
	                if ("lastTime".equals(cookie.getName())){
	                    value = cookie.getValue();
	                    value = URLDecoder.decode(value,"utf-8");
	                    break;
	                }
	            }
	        }
	        //有没有值,有值说明取出来了,没值就第一次
	        if (value==null) {
	            response.getWriter().print("<h1>欢迎您首次访问本站<h2>");
	        } else {
	            response.getWriter().print("<h1>您上次访问本站的时间是:" + value + "<h1>");
	        }
	        //创建cookie,将当前时间作为cookie的值发送给客户端
	        String newTime = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
	        newTime = URLEncoder.encode(newTime, "utf-8");//进行URL编码,否则日期和时间有个空格,Cookie无法存储特殊字符
	        Cookie cookie = new Cookie("lastTime", newTime);//设置Cookie的名字为lastTime,值为编码后的时间
	        cookie.setMaxAge(60 * 60);//设置存活时间为1个小时,超过这个时间Cookie就凉了
	        response.addCookie(cookie);//将Cookie放在响应头里
	    }
	}

什么是Session

概念:一种服务器端会话技术,将数据保存在服务器端的对象中(HttpSession),用于一次会话的多次请求间共享数据.
Session就好像人们(浏览器)访问医院时,医院(服务器端)生成一张排队票,票上有唯一的卡号(id),医院根据这个id便可以查询到该病人的病例

当浏览器访问服务器时,Servlet容器会创建一个Session对象和ID属性,Session对象相当于病例信息,ID相当于卡号,客户从浏览器访问服务器时,将SessionID传递给服务器,服务器就能判断是那个客户端发出的,从而选择对应的Session对象为其服务

Session借助Cookie技术来传送ID属性,就是SessionID被储存在Cookie中响应给浏览器,在响应头可以看到Set-Cookie:JSESSION=11111;当浏览器访问服务器时,会在请求头中将Cookie(Cookie:JSESSION=11111)发送给服务器,服务器根据ID找到对象的Session对象

Session工作流程
在这里插入图片描述

Session方法

HttpServletRequest定义了获取Session对象的getSession方法

//带参构造方法中如果传递的参数为true,则在相关的HttpSession对象不存在时创建新的HttpSession对象,为false,就不创建新的Session对象,返回null值
public HttpSession getSession(booblean create)
//空参构造方法通带参的true,没有相关的HttpSession对象时就创建新的对象
public HttpSession getSession()

仅介绍HttpSession的几个常用方法

方法声明方法描述
Object getAttribute(String name)通过name获取指定的属性对象
void setAttribute(String name, Object value)设置指定name的属性对象
void removeAttribute(String name)删除指定名称的属性
String getId()返回HttpSession对象相关联的SessionID值
long getCreationTime()返回Session创建的时间距1970年1月1日00:00:00相差的毫秒值
void invalidate()用于强制使Session对象无效
boolean isNew()判断当前HttpSession对象是否是新创建的
ServletContext getServletContext返回所属的ServletContext对象

Session超时管理

	在http协议中无法判断客户端与服务器什么时候断开连接,无法检测浏览器是否关闭,为了防止服务器保留的HttpSession对象积累的过多导致内存耗尽,web服务器采用超时限制,当客户端在指定的时间内没有访问服务器,服务器就会认为客户端已经结束请求,与该客户端的会话对应的HttpSession对象就会变成垃圾对象,从内存中被清除掉,超时后再次请求,就会创建新的Session对象,并分配新的SessionID
在tomcat安装目录\conf\web.xml文件中可修改超时管理时间,默认时间为30分钟,如果设置成负数或0表示会话永不超时
    <session-congig>
        <session-timeout>30</session-timeout>
    </session-congig>

Session的生命周期

  • 服务器关闭时会自动调用invalidate()方法,HttpSession对象会被销毁

  • 超过超时管理时间,HttpSession对象会被销毁

  • 手动调用invalidate()方法,HttpSession对象会被销毁

注意:如果没有指定Cookie的存活时间,当重启浏览器时原来的Cookie就会被销毁,其存储的SessionID也会消失,这时再次访问服务器会产生新的会话,以及新的HttpSession对象,无法再使用以前对象所拥有的属性

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值