本博客基于B站狂神老师的JavaWeb课程,地址:https://space.bilibili.com/95256449,记录自己的代码和老师的笔记,同时也会有自己关于这些知识的理解,如果有错误请评论告诉我。
7,Cookie,会议
7.1会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个网络资源,这个过程可以称为会话。
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称为有状态会话;
你怎么证明你是西开的学生?
你→西开
1.票务西开给你票务2.学校登记西开标记你来过
一个网站,怎么证明你来过?
怎么让服务端知道客户端来过?
1.服务端给客户端一个信件📃,客户端下次访问服务端带上信件就可以了; 2。服务器登记你来过了,下次你来的时候,我来匹配你;
无状态会话:打开网站,关闭网站;
7.2保存会话的两种技术
饼干
-客户端技术(响应,请求)
会话
-服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或数据放在Session中!
常见场景:网站登录之后,下次你不用再登录了,第二次登录直接就上。
7.3Cookie
![在这里插入图片描述(https://img-blog.csdnimg.cn/20200506182559338.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JlbGxfbG92ZQ==,size_16,color_FFFFFF,t_70)
1.从请求中拿到cookie信息2.服务器响应给客户端
//保存用户上一次访问的时间
public class CookiesDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你,你来的时间,把这个时间封装成为一个 信件,你下次带来,就知道是你来了
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie,服务端从能够客户端获取;
Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个
//判断cookie是否存在
if(cookies!=null){
//如果存在cookie
out.write("你上一次访问的时间是:");
for(Cookie cookie:cookies){
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}else{
out.write("这是你第一次访问");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//cookie的有效期为一天
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie); //响应给客户端一个cookie
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
cookie:一般会保存在本地的用户目录下的appdata;
一个网站的cookie是否存在上限?
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,最多存放20个;
- Cookie大小有限制 4kb
- 300个cookie浏览器上限
删除Cookie:
- 不设置有效期,退出浏览器
- 把有效期设置为0
public class CookiesDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//名字必须要和 需要被删除的Cookie 相同(这里是指lastLoginTime)
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
cookie.setMaxAge(0);
//相当于用同名的一个cookie,把之前的cookie的有效期修改成0,那么它就间接的被删除了
//如果名字不一样,在这样的操作下,之前的cookie还是存在。
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
编码解码
URLEncoder.encode("秦疆","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")
7.4 Seesion
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Seesion对象;
- 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息;
Session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建;
使用场景:
- 保存一个登录用户的信息;
- 购物车信息;
- 在整个网站中经常会使用的数据,我们将它保存在Session中;
- 基本使用
public class CookiesDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你,你来的时间,把这个时间封装成为一个 信件,你下次带来,就知道是你来了
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie,服务端从能够客户端获取;
Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个
//判断cookie是否存在
if(cookies!=null){
//如果存在cookie
out.write("你上一次访问的时间是:");
for(Cookie cookie:cookies){
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}else{
out.write("这是你第一次访问");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//cookie的有效期为一天
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 通过Session传递信息
public class SessionDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 删除Session
public class SessionDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//session.removeAttribute("name");
//删除session后,浏览器会马上自动分配一个新的
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Session自动过期:web.xml配置
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后Session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
ervletResponse resp)引发ServletException,IOException {doGet(req,resp);}}
**会话自动过期:web.xml中配置**
XML <会话配置> < - 15分钟后会话自动失效,以分钟为单位< - -设置会话重置的失效时间!>! -> <会话超时> 15 </会话超时> </会话配置>
`