自学JavaWeb_Session&Cookie
Session&Cookie
一、会话技术
什么是会话技术?(相当于打电话)
在计算机语言(领域)中, 是存在会话的, 客户端与服务器端之间的一次通话, 就称为会话;
当打开浏览器的那一刻, 并访问了一个地址(发送请求), 就开了一次新的会话, 会话期间可以对网站的站点发送多次请求(访问), 这样实际都是在一次会话中操作,浏览器关闭时, 代表会话结束;
会话就是客户端与服务器端一次不间断的请求和响应;
会话技术的分类:
- 客户端的会话技术: Cookie
- 服务器端的会话技术: session
(一)Cookie
1、Cookie简介
Cookie: 直译: 曲奇饼, 小饼干;
Cookie: 是浏览器和服务器之间传递数据的一张小纸条(文件); 也是保存在浏览器端一种特殊缓存技术;
服务器负责:
- 负责写小纸条, 发送给浏览器端
- 服务端接收小纸条并解析小纸条中的数据
浏览器负责:
- 负责保存小纸条
- 并将小纸条再次发送给服务器
应用场景:
- 七天记住密码
- 判断用户是否登录过此网站
- 用来记录购物车用户使用偏好来定制推送
2、查看Cookie
查询cookie信息:
Cookie删除:
或者:
快捷键: Ctrl + shift + delete 来删除所有cookie:
3、Cookie的使用
cookie入门案例
l 案例1:服务器给浏览器写cookie
以响应头的形式发送的
Cookie存储的位置:
l 案例2:浏览器把cookie传递给服务器,服务器解析
方法名 |
描述 |
getName() |
获得cookie名称。 |
getValue() |
获得cookie的值。 |
cookie种类:
种类:
- 会话级别的cookie: 会随着浏览器的关闭, cookie销毁
- 持久化级别cookie: cookie保存到浏览器端指定的位置后, 给cookie设置一个生存时间;
方法名 |
描述 |
setMaxAge(int expiry) |
设置cookie的生存时间。 单位:秒。 Int的取值范围: -1: 默认是会话级别的cookie 0: cookie立即销毁 1: 持久化的cookie, 存活时间是1秒 七天自动登录:60*60*24*7 l 如果没有设置,cookie只缓存浏览器缓存中,浏览器关闭,cookie删除。 l 如果设置有效时间,在时间范围内,cookie被写入到浏览器端,关闭浏览器下次访问仍可获得,直到过期。 |
案例:
以学生信息管理系统中的登录功能为例,用户登录成功后,将用户信息(账号和密码)保存到Cookie中,再次登录时从Cookie中直接获取账号和密码,自动加载到文本框中,避免手动输入。
说明:当第一次访问登录页面login.jsp时,账号和密码文本框是空的。
当使用正确的账号和密码登录成功后,关闭浏览器,再次打开登录页面login.jsp时,会自动加载账号和密码到对应的文本框,可以直接单击登录按钮进行登录。
总结cookie的特点:
- Cookie只能保存键值对的形式(字符串)
- Cookie的数据量大小有限制, 不能超过4kb;
- Cookie是保存在客户端的, 与服务器端无关
- Cookie默认有效期是会话级别的cookie, 会随浏览器的关闭, cookie销毁;, 如果想要持久化cookie, 就要设置cookie的生存时间;
(二)Session
1、Session简介
Session是服务器提供的一个会话对象,是第二大作用域对象。创建之后这个Session是存储到服务器中的。但Session的使用需要和浏览器建立关联,这个关联与Cookie有关,其中每一个Session对象都会对应一个sessionId,这个sessionId就被存储在Cookie中。
Session会话跟踪技术原理:(面试题)
1、第一次发送请求时,服务器会创建session,对应一个JSESSIONID,每次客户端请求的时候都会携带JESSIONID进行服务器访问,如果这个JSESSIONID不存在,到达服务器之后会创建一个新的SESSION并将ID保存至客户端,如果存在直接使用这个SESSION。
2、请求的时候如果发现当前JESSIONID在服务器找不到,就会重新创建新的SESSION。
3、如果关闭了浏览器,即周期会话结束,客户端存JESSIONID这个Cookie就会消失(这是利用了Cookie的特性,默认有效期是浏览器关闭),再次访问的时候需要服务器重新创建SESSION,旧的SESSION在服务器端并未销毁,而是由于存储在客户端的JESSIONID丢失,从而无法引用,这样的SESSION会被GC回收。
2、Session的使用
入门案例:
案例1: 获取session对象
案例2: 使用session进行数据共享(作用域对象)
Session的生命周期:
创建: HttpSession session = request.getSession();
销毁:
- 服务器非正常关闭时, session销毁
- 手动调用session.invalidate();
- Session默认30分钟内有效, 30分钟在哪设置?(tomcat的web.xml配置文件)
案例1:
当用户登录成功进入网站首页后,在首页显示欢迎XXX登录。
分析实现思路:
1)在用户登录成功时将用户信息保存到Session中
session.setAttribute("username", username);
2)在用户首页从Session中获取用户信息并显示
<h2>欢迎${username }登录!</h2>
案例2:
使用Session完成登录控制。网站首页在未登录情况下不允许访问。
分析实现思路:
1)在用户登录成功时将用户信息保存到Session中
session.setAttribute("username", username);
2)在首页对Session数据进行判断,如果存在用户信息表明已登录,可以访问该页面,否则强制跳转到登录页,先登录再访问。
总结session特点:
- 存在服务器端
- 默认生存时间30分钟
- Session是第二大作用域对象
- Session中可以存存储任意类型数据
3、Session与Cookie的区别和关联
区别:
- 存储位置不同: cookie存储在客户端, 而session存储在服务器端
- 存储数据量大小不同: cookie存储数据有限, 不能超4KB, 而session没有上限
- 存储的数据类型不同: cookie只能存储字符串类型, 而session可以存储任意类型
- 默认有效期不同: cookie默认是会话级别cookie, 会随着浏览器的关闭, cookie销毁, 而session默认30分钟;
关联:
Cookie和session都是服务于浏览器的, session需要借助于cookie才能实现会话, cookie中默认存储这JSESSIONID的值, 根据这个JSESSIONID区匹配对应的session, 关闭浏览器JSESSIONID就是消失, 而不是销毁, 还是依然存在的, 只是找不到.最终会被GC收回;
二、项目改造
(一)日期类型回顾
MySQL中的日期类型:
date:yyyy-MM-dd
time:hh : mm :ss
datetime:yyyy-MM-dd hh:mm:ss
java中的日期类型:
java.util.Date Wed Feb 05 16:34:14 CST 2020
java.sql.Date 2019-12-30
util工具包中的日期类型显示的信息全,而sql包中的日期类型只显示年月日,因此我们在开发过程中多使用util包中的Date类型。
在实际开发中,往往会涉及到日期类型与字符串类型之间的相互转换,我们可以借助于SimpleDateFormat类进行相互转换,为了使用的方便,我们可以专门定义一个日期转换的工具类。
为了后期的方便使用 可以封装成一个工具类(时间工具类)
(二)学生项目改造
需求:在学生表中添加一列出生日期
最终实现:
虽然以上日期也能够实现, 但是让用户手动输入日期就不太友好, 并且手动输入格式各种各样;
优化: 借助一款日历控件;
(三)日历控件的使用
下载日历控件http://www.my97.net
(四)JSTL时间格式化
优化:将后边的零去掉(就要进行时间的格式化)
需要用到了jstl标签库的格式化库
- 引入格式化标签库
- 对日期进行格式化
(五)模糊查询
需求:根据学员姓名进行模糊查询,如果文本框中有值则按关键字模糊查询,否则查询全部。
Sql语句:只能模糊查询