JavaWeb学习的第十五天(会话技术之Cookie_Session)

一、会话技术的引入

1.问题:将验证码保存在servletcontext中会有问题,这是一个域对象,并且是一个全局变量,如果有两个人同时去获取验证码,第一个人还没有输入验证码,这个时候第二个人已经重新请求了验证码,所以第一个人会一直显示验证码输入错误
2.需求:每个用户去访问服务器的时候,验证码都应该保存在一个共享内存中,但是这个共享内存必须是每个浏览器独立的
3.会话:打开浏览器到关闭浏览器之间所做的一系列请求,我们称之为一次会话
4.会话技术:在一次会话的多次请求之间共享数据,因为http协议无状态(相互独立,无法共享数据)

二、Cookie的学习

1.使用Cookie的过程演示

2.特点:数据会保存在浏览器中
3.代码实现

//第一次请求服务器,服务器给浏览器响应cookie
   Cookie cookie = new Cookie("code",code);
   resp.addCookie(cookie);
//再次请求服务器,会携带上一次响应的cookie,然后服务器会获取cookie
   Cookie[] cookies = request.getCookies();
       if(cookies!=null&&cookies.length>0){
           for (int i = 0; i < cookies.length ; i++) {
               String name = cookies[i].getName();
               String value = cookies[i].getValue();
               System.out.println("服务器生成的验证码"+name+":"+value);
           }
       }
//用户输入的验证码
   String checkcode1 = request.getParameter("checkcode1");
   System.out.println("用户输入的验证码code:"+checkcode1);
//演示结果
   用户输入的验证码code:ocq4p
   JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
   服务器生成的验证码code:OCQ4P
   Idea-dfc259e4:a9775511-fb8e-4df1-8db7-1a278efd9dd3

4.Cookie在传输过程中存在的位置

响应消息的响应头里面会响应set-Cookie:code=OCQ4P(每一个浏览器必须要支持cookie,cookie在响应头里面),自动保存在浏览器内存中
请求消息的请求头里面会携带Cookie:code=OCQ4P,自动携带

5.cookie的相关方法

//设置cookie的有效路径,以后只有浏览器访问这个路径的资源才会携带这个cookie*/
	String code="bianyiit-path_编译IT";
	Cookie cookie = new Cookie("code",code);
	cookie.setPath("/Cookie03/user");//这里需要设置cookie的真实路径
	浏览器访问(localhost:8080/Cookie03/user/servletDemo04);//访问的时候也要加上真实路径

6.在cookie中使用中文会出现乱码问题--响应行和响应头里面不能有中文

中文--非中文--中文 URLEncoder
//URL编码
	String code="bianyiit-path_编译IT";
	code = URLEncoder.encode(code, "utf-8");
//解码
	code = URLDecoder.decode(code, "utf-8");

7.面试题--cookie的分类:持久级别的cookie和会话级别的cookie

会话级别的cookie:
    cookie保存在浏览器内存中,浏览器关闭,cookie消失(一次会话范围内有效)
持久级别的cookie:
    Cookie cookie = new Cookie("code",code);
    //设置cookie的有效时间
    cookie.setMaxAge(5*60);//保存五分钟
    resp.addCookie(cookie);
删除持久级别的cookie,可以设置cookie的有效时间为0
    Cookie cookie = new Cookie("code","");
    cookie.setMaxAge(0);
    resp.addCookie(cookie);

三、Session的学习

1.使用Session的过程演示

2.特点:数据保存在服务器中
3.代码演示

//产生验证码保存在服务器的Session里面
	HttpSession session = req.getSession();
	session.setAttribute("code",code);
//第二次请求服务器的时候,从Session取数据
	HttpSession session = request.getSession();
	Object code = session.getAttribute("code");
关闭浏览器之后,Session里面不会保存之前的数据,因为是在一次会话中

4.基本原理

set-Cookie:JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
Cookie:JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
用一个唯一的ID去标识Session,两个用户同时访问服务器的时候,会通过携带过来的ID找到对应的Session
第一次请求的时候没有携带JSessionID,所以第一次请求的时候是创建Session,然后响应JSessionID给浏览器
第二次请求和以后的请求就会标识对应浏览器携带的JSessionID去对应的Session里面去取对应的数据
Session的实现基于cookie

5.Session的一些细节

//关闭浏览器,服务器并不知道浏览器关闭了,所以Session并不会立马销毁,在项目的配置文件web.xml中,我们看见Session的保存时间为30分钟
//Session可以作为域对象存储数据
//三个域对象的作用范围
	request :一次请求
	session :一次会话的多次请求之间
	servletContext:整个web项目

6.Session的生命周期

创建:
	浏览器第一次调用request的getSession方法的时候去创建Session
销毁:
    1.默认30分钟有效时间到期
    2.手动调用session.invalidate();
    3.服务器非正常关闭的时候,session会销毁
    4.如果正常关闭服务器,Session会被钝化(序列化)到磁盘,下一次重新启动tomcat的时候,Session又会被锐化(反序列化)到内存中
    在IDEA中,每次发布项目都会创建tomcat的临时配置,每次重启tomcat,配置文件都会重新生成,之前的会被删除

7.cookie和session的区别

1.cookie的数据是保存在浏览器中的,session的数据是保存在服务器中的
2.cookie相对不安全,而session相对安全
3.cookie只能保存少量的数据到浏览器(对cookie的个数和大小有限制,并且对每个项目的cookie数据也有限制)
4.session对保存的数据量和个数没有限制

8.防止验证码重复使用

//为了防止用户通过浏览器的回退按钮,再次输入原来的验证码还是可以登录进去
//在获取完Session中的验证码之后将服务器中Session的内容移除掉
String code=(String)request.getSession().getAttribute("code");
request.getSession().removeAttribute("code");
发布了73 篇原创文章 · 获赞 11 · 访问量 2438

猜你喜欢

转载自blog.csdn.net/weixin_43908333/article/details/103771283