小马哥网络课笔记25------cookie、session
2022-03-02 本文已影响0人
夜凉听风雨
场景
-
浏览网页经常会遇到这些场景:
1、直接访问某个需要登录的页面,会先跳转到登录页面。
2、在登录页面登录后,再访问其他的页面,会直接有登录的信息。
3、登录成功后,关闭浏览器,下次直接打开登录后的某个页面地址,也能直接登录访问。
4、登录成功后,关闭浏览器,隔了很多天下次直接打开登录后的某个页面地址,会跳转到登录页面。
这其中就涉及到cookie和session技术。
流程
访问页面流程.png图解:
1、小明浏览器访问登录页面后,输入用户名和密码登录。
2、登录成功服务器会创建一个Session,内部保存了小明的id和用户名密码。
3、然后在响应头里返回Set-Cookie:JSEESIONID=666这样的头信息。
4、浏览器收到响应头里的Cookie信息会存在本地。
5、下次再访问localhost:8080/xx/users接口的时候,会在请求头里将Cookie: JSEESIONID=666带上。
6、服务器收到浏览器的请求,发现请求头里有Cookie属于小明的ID和用户名,就会在Session里去查找,如果查找到就会把小明的信息返回给浏览器。
- 默认情况下浏览器关闭时cookie将被清除,如果不关闭是30分钟有效。
- 服务器也可以在返回Cookie的时候带上Cookie的过期时间,例如设置一周过期,那么浏览器即使关闭,一周内再次访问已经会带上这个cookie。
下面我将创建一个项目,来简单看一下效果。项目包括前端的登录页面,和后端的登录接口以及获取users数据的接口。
-
后台登录接口代码:
这段代码是在用户登录成功后,创建session并将用户名和密码存入其中。session会自动生成一个JSSESIONID并且响应头里会自动带上cookie信息。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("Application/json;charset=UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("mj".equals(username) && "mj".equals(password)) {
// 创建session并将用户信息存放到session中
HttpSession session = req.getSession();
session.setAttribute("username", username);
session.setAttribute("password", password);
resp.getWriter().write("登录成功");
} else {
resp.getWriter().write("登录失败");
}
}
-
后端获取users数据接口代码
这段代码通过请求头中的cookie来找到对应的session,从而判断是哪位用户,验证用户身份后返回数据。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
req.getSession()的执行流程
1.如果req没有带JSESSIONID,就会创建新的session对象
2.如果req带了JSESSIONID,就会返回相应的session对象
*/
HttpSession session = req.getSession();
String username = (String) session.getAttribute("username");
if ("mj".equals(username)) {
// 说明session中有mj这个用户名
resp.getWriter().write("响应数据");
} else {
// 说明mj还没有登录成功,重定向到登录页面
resp.setStatus(302);
resp.setHeader("Location","/cookie/login.html");
}
}
运行项目,访问登录页面
登录页.png输入用户名密码登录成功,检查login接口,可以看到响应头有一个Set-Cookie,并且值是JSESSIONID=XXXXX; Path=/cookie; path是指定了浏览器下次访问哪个路径请求头里会自动带上这个cookie。
cookie信息.png如果登录失败直接访问http://localhost:8080/cookie/users,请求不会带上cookie,并且会跳转到登录页面。
如果登录成功,再访问http://localhost:8080/cookie/users,请求会带上cookie,并且拿到数据。