日升时奋斗,日落时自省
目录
1、Cookie
2、Cookie关联Session
2.1、区别
3、模拟登录解析Session
3.1、登录html
3.2、登录LoginServlet类
3.3、主页面 IndexServlet类
3.4、交互过程中的Session
有区别的首先就需要有联系,两者无关的情况下就不存在区别之说
此处从Cookie说到Session
Cookie在HTTP里就提及到了,相关Cookie的几个重要问题
<1>Cookie是干什么的?
浏览器提供的持久化存储数据的机制
<2>Cookie从哪里来?
Cookie从服务器返回浏览器的,服务器代码由我们自己决定要把啥样的信息保存到客户端这边,通过HTTP响应的Set-Cookie字段,把键值对写回去即可
<3>Cookie到哪里去?
Cookie会在后续浏览器访问服务器的时候带到请求的header中发给服务器
为啥第一次来要服务器发送给客户端,后来又要发回去,放到Cookie放到客户端这边不就好了??
是为了响应客户端发来的请求,注意:客户端不是一个,是N多个;此时服务器就可以通过cookie中的值,来识别当前客户端是谁,当前客户端的服务器提供到哪个环节(原来客户端访问页面到什么地方了,告诉服务器我是那个人,需要对应当前客户端的那个记录)
<4>Cookie存储在哪里?
存储在浏览器(也就是我们锁指定的客户端)所在主机的硬盘中;怎么存:浏览器会根据域名来分别存储
登录中的Cookie
典型使用领域,验证账号身份信息
当你再次进行请求页面的时候就不需要再输入密码了,此时的服务器就收到Cookie中身份序号,去查询服务器中当时以类似hash表的结构,看一下是哪个用户
<1>如果找到了,返回对应的信息,就不需要再次登录了;
<2>如果没有找到,要求用户登录(可能是该用户从来就没有登录过,也可能是Cookie过期了)
此处“过期”解析:过期意味着:可能是客户端把cookie删了;也可能是服务器这把对应的身份信息删了;这两种情况都被视为过期(因为不能用了)
设置过期的原因?
针对网站的敏感性,在公共电脑上为了保护使用同一台电脑不同用户在网站留下的信息,例如你登录有网站买东西,登录后下机了需要自己去注销,但是如果忘记手动注销了,下一个人使用你的这台电脑就能看见(过期设定就是为了你忘了注销,后会在一定时间内服务器删除身份信息,也就过期了)
有了前面的基本理解,下面针对Cookie和Session区别就容易很多了
关联:在网站的登录功能中,需要配合使用
<1>Cookie是客户端的存储机制,Session是服务器的存储机制
<2>Cookie里面可以存各种键值对(还可以存储别的),Session则专门用来保护用户的身份信息
扩展:Cookie完全可以单独使用,不搭配session(实现非登录场景其实就可以不搭配)
Session也可以不搭配Cookie使用(例如:手机app登录服务器,服务器也需要Session,此时就没有Cookie的存在)Cookie跟浏览器具有强相关
Cookie是属于HTTP协议中的一部分,Session可以和HTTP有关也可以和HTTP无关(领域适用范围TCP,websocket)
制造一个登录页面,点击提交按钮,触发一个登录请求,我们自己写的LoginServlet类内验证用户名密码是否正确,如果正确则登录成功,跳转到主页;
关于Cookie中的Session如何能看的更清楚
此处通过一个登录页面和一个主页面展示
构思:涉及到两个Servlet
<1>处理登录的LoginServlet判定用户名密码
<2>构造主页面
简单的构造一个登录页面(仅仅是为了能检验出来效果)不在给出代码了(主要目的是为了展示SessionId)
以下是大体思路:
编写一个登录页面也就是上图中给出的Login.html文件(以下已经附上代码了)
Document
会话已经在上图中有了比较清晰的解释,但是在清晰也没有图片清晰是吧(以下都是举例)
试问:两个页面,能不能登录不同账号??
答案:不能;打开的这两个页面使用的是共同的Cookie ,共用一个登录状态;注销重新登录,只能是相当于服务器重新创建了一个会话,身份标识也会被附上一个新的
特殊的情况可以,当然不是正常浏览器模式的情况下(例如:无痕模式)
附代码:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
//验证用户名密码是否正确
//正常情况下,用户名密码会使用数据库来保存
//为了演示就不在使用数据库
//约定一个正确的
if(!username.equals("zhangsan")&&!username.equals("lisi")){
//登录失败
//重定向 到登录界面
System.out.println("登录失败 用户名错误");
resp.sendRedirect("login.html");
return ;
}
if(!password.equals("123")){
System.out.println("登录失败,密码错误");
resp.sendRedirect("login.html");
return ;
}
//创建成功
//创建一个会话 如果会话存在返回 如果不存在创建
HttpSession session=req.getSession(true);
// 当然会话就是一个 保存用户名的 也是一个map
session.setAttribute("username",username);
//开始重定向 到下一个页面
resp.sendRedirect("index");
}
}
附代码:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
//通过重定向 浏览器发起的是GET
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先判定用户的登录状态
//如果用户还是没有登录的状态 要求先登录
//已经登录 则根据会话 中的用户名 显示到页面上
//这个操作 不会触发会话 的创建
HttpSession session=req.getSession(false);
if(session==null){
//未登录状态
System.out.println("用户未登录");
resp.sendRedirect("login.html");
return ;
}
ServletContext context=this.getServletContext();
Integer count=(Integer)context.getAttribute("count");
if(count==null){
count=1;
}else{
count++;
}
//上面已经处理好了当前 刷新的情况
context.setAttribute("count",count);
//已经登录后
String username=(String)session.getAttribute("username");
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("欢迎"+username+"回来"+count);
System.out.println(count);
}
}
注:只要完成登录以后,之后的请求多次服务器也都会带上刚刚的Cookie的值(也就是SessionId)
事例解析:
整个Cookie与Session就像是首次到首次到大学一样,要办理一张学生卡(就相当于是登录,创建会话,分配了SessionId)
登录就是领取学生卡;
创建会话:就是学生证本身;
SessionId:学生证上的学号(独一无二)
你的身份信息就被学校录入了,给你的学生卡里面就包含了你的SessionId
后续操作:就跟你在学校干啥有关了(也就相当于请求与响应的关系)
事例1:你要去图书馆要刷卡才能进去,此时上面可以通过卡来借书,借书信息就存储在卡上了,学生卡(HttpSession)中就设定了一些属性(attribute)表示你的借书了(根登录的信息属性一样)
事例2:你平常进出校门需要用学生证刷门禁,此时学生卡中信息属性就有用了,根据的你的学号证明你是本校的学生(相当于SessionId唯一性)
注:你的学生证就是cookie 里面存放了SessionId