文章目录
一.Cookie详解并使用
(1)Cookie是什么 ?
- Cookie是网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
(2)为什么要使用Cookie?
- web程序是使用HTTP协议传输的,而HTTP协议是无状态的协议,它对于事务处理没有记忆能力。如果后续需要处理前面的信息,则必须重传,这导致需要额外传递一些前面的重复请求,才能获取后续响应
(3)Cookie的工作原理
- 当你第一次登录某个网站后,该网站的服务器发送给客户端的一个密令(Cookie),每次请求服务器时,浏览器出示该密令,服务器通过验证令牌来找到对应的用户。 这个令牌就是Cookie
(4)Cookie的特点
- cookie存储的数据量有限,浏览器中的Cookie存储的数据一般不超过4KB
- 浏览器可以禁用Cookie
- 浏览器存储的Cookie数量有限,超过的话,最早创建的Cookie会被删除
(5) Cookie的种类
- 会话Cookie: 存储在浏览器内存中,浏览器在关闭之后该 Cookie 失效
- 持久Cookie: 存储在客户端的本地磁盘上,用于长久保持用户登录状态
- Cookie对象有一个Max-Age属性,Max-Age属性的值就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除
- 在创建Cookie时Max-Age属性默认用-1赋值,-1表示这是个会话Cookie,大于0表示这是个持久Cookie
(6)应用场景
(7)Cookie什么时候被创建及怎么手动创建
- 默认创建
这里讨论的是用户第一次访问网站时,此时浏览器没有该网站返回的Cookie
- 当用户访问的是JSP这类技术编写的页面时,服务器自动为该浏览器创建一个会话Cookie
- 当用户请求一个servlet并且该servlet中调用了request.getSession()方法时,服务器自动为该浏览器创建一个会话Cookie
这种Cookie的name属性的值为“JSESSIONID”,它的value属性就是session id
- 手动创建并设置生存周期
这里讨论的是在Java的servlet中创建
1.赋值这段代码
String name = ”hello“
String value = "world"
//创建一个Cookie对象
Cookie cookie = new Cookie(name,value);
int time = 60;
//设置cookie的存活时间
//当time等于0时,删除cookie
//当time等于-1时,表示关闭浏览器时删除cookie
//否则,当过了time秒时,删除cookie
cookie.setMaxAge(time);
String cookiePath = "/";
//设置cookie对象的访问路径
//唯一确定一个cookie对象靠cookie的名字和访问路径
cookie.setPath(cookiePath);
//放回Cookie给浏览器
resp.addCookie(cookie);
- 在servlet中(需先获取)设置会话Cookie为持久Cookie
//得到该服务器为客服端创建的所有Cookie
Cookie [] cookies = request.getCookies();
for(Cookie cookie :cookies){
//找到名为JSESSIONID的cookie,这是服务器为浏览器默认创建的
if(cookie.getName().equals("JSESSIONID")){
//通过设置存活时间为1000000(大于0)来把这个会话cookie变成持久cookie
//设为0的话就是要删除这个cookie
//设为-1的话就是关闭浏览器时删除cookie
cookie.setMaxAge(1000000);
//把修改后的cookie发送给浏览器
response.addCookie(cookie);
}
}
二.Session详解实现持久化用户登录状态
(1)什么是会话 ?
- 从服务器创建Session到Session 过期的过程
(2)什么是Session ?
- 就是服务器发送给客户端一个令牌,该令牌上有唯一标识的ID,每次请求服务器时,浏览器出示该令牌,服务器通过令牌上的ID来找到对应的用户
- Sessino保持在服务器端,因此可以存储大量数据
(3)Session什么时候被创建及怎么创建?
- 默认创建
这里讨论的是用户第一次访问网站时,此时该网站的服务器没有为浏览器创建Session
- 当用户访问的是JSP这类技术编写的页面时,服务器自动为该浏览器创建唯一一个session
- 如果请求的是servlet,且该servlet中调用了request.getSession()方法时,服务器自动为该浏览器创建唯一一个session
每个session对象在服务器中都有唯一一个session id
- 如果服务器没有为发送请求的浏览器创建Session时,request.getSession()会自动创建一个Seession并返回;如果有的话,该方法会找到这个Session并返回
- 在创建Session后,服务器会自动创建一个Cookie并返回给浏览器
(4)创建Seesion之后服务器会干什么?
- 会在该次响应中某种方式在响应头中携带session ID ,并返回该响应头给客户端
(5)携带session id的方式
- cookie(最常用的)
- 如果以cookie的方式携带seesion id的话,服务器创建session之后会在该次响应中返回包含set-cookie字段的响应头
- Set-Cookie 字段的值就是一个Cookie对象(会话cookie),该cookie的name属性就是“JSESSIONID”,它的value属性就是该Session对象是的session id
- URL重写的方式(针对cookie被禁的情况): 就是将session id 附加在URL路径的后面,然后提交给服务器
附加方式1:作为URL路径的附加信息
附加方式2:作为查询字符串附加在URL后面
- 在页面表单里面增加隐藏域(和第二种的区别是它使用post)
服务器自动修改表单,添加一个隐藏字段,在表单提交时把session id 传递会服务器
(6)用session来验证登入
- 登录成功后存入用户名和密码到Session中
//把username存入到Session对象中名为name的属性
request.getSession().setAttribute("name", username);
request.getSession().setAttribute("password", password);
//删除name属性,若name不存在,则不执行
//request.getSession().removeAttribute(name);
- 从Session中拿到用户名和密码
//从session中得到name属性的值
String name = (String) request.getSession().getAttribute("name");
String pad = (String) request.getSession().getAttribute("password");
//判断用户和密码是否正确
if (Login.login(name , pad)) {
//正确,重定向到main.html页面
ServletContext servletContext = request.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDisatcher("/main.html");
requestDispatcher.forward(request , response);
(7)Session失效并设置Session失效的时间
-
当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭,所有需要服务器为 Session 设置一个失效时间,来节省存储空间
-
当距离客户端上一次使用 Session 的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,然后把 Session 删除以节省存储空间
-
设置Session失效的时间
//获取客户端的session,如果不存在,自动创建一个
HttpSession session = req.getSession();
//设置session的最大存活时间为1000s
session.setMaxInactiveInterval(1000);
//销毁session
//session.invalidate();
三. Seesion与Cookie结合使用分析
这里假设服务器是以Cookie的形式携带session id
当浏览器向服务器端发送了一个携有Cookie请求时,浏览器会把此 Cookies 放到请求头一起提交给服务器,服务器通过此Cookies 的value属性值来找到对应的Session, 然后再通过该 Session 来获得存在该对象中的信息