(web后端)04_JavaWEB会话与状态管理

一、前提

  1. WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。

  2. WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。
    在 Servlet 规范中,常用以下两种机制完成会话跟踪

    Cookie
    Session

二、Cookie

2.1.Cookie机制

  1. Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件
  2. 一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
  3. 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
  4. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  5. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  6. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

2.2.Cookie的使用:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
  //创建一个cookie  并保存信息
    Cookie cookie = new Cookie("username","admin");
    //将cookie信息响应给客户端
    resp.addCookie(cookie);
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
}

在这里插入图片描述

2.3.cookie的获取

<%--        获取所有的cookie对象 --%>
    <%

         Cookie[]  cookies =   request.getCookies();
        for(Cookie cookie : cookies){
   
           String name =  cookie.getName();
           String value = cookie.getValue();
    %>
    <h1><%=name%></h1>--- <h1><%=value%></h1>
    <br/>
    <%
        }
    %>

在这里插入图片描述
JSSESIONID:是服务端产生 来标记一次会话的数据 会话ID 每一个会话值都是唯一的
存储我们自定义的信息
username= admin
在cookie中寻找自己关注的cookie

 Cookie[]  cookies =   request.getCookies();
for(Cookie cookie : cookies){
   

   String name =  cookie.getName();
    String value="";
    //寻找关注的cookie信息
   if(name.equals("username")){
   
       value = cookie.getValue();
       }
  }

2.4.Cookie的分类:

cookie分为会话cookie和持久cookie
setMaxAge()设置cookie的存储时间
时间单位为秒
如果是-1 则表示永久存储 无限期
如果cookie没有设置maxAge 则为会话cookie

//存储时间为一天
cookie.setMaxAge(60*60*24);

2.5.Cookie的应用案例

2.5.1.自动登录

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆页面</title>
</head>
<body>
    <form action="/login.do" method="post">
        <input type="text" name="username" value=""><br><br>
        <input type="checkbox" name="isAutoLogin">
        <input type="submit" value="登陆">
    </form>

</body>
</html>

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
   
    @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 {
   
        //获取用户名
        //如果用户名不为空 则进行用户名密码的校验 如果校验通过 则直接登陆 并将登陆信息保存到cookie
        //如果用户名为空 获取cookie中的数据 cookie中是否有登陆所需信息 如果有 则直接进行校验 校验通过登陆
        //校验不通过 则返回登陆页面 让用户重新登陆
        String username = req.getParameter("username");
        if (username !=null && !username.equals("")){
   
            if ("admin".equals(username)){
   //校验通过

                //并将信息保存到cookie中
                Cookie cookie = new Cookie("username",username);
                cookie.setMaxAge(30);
                resp.addCookie(cookie);
                resp.sendRedirect("/home.jsp");//重定向到主页
            }else{
   
                return;
            }
        }else{
   
            Cookie[] cookies= req.getCookies();
            if (cookies!=null && cookies.length > 0){
   
                for (Cookie cookie:cookies){
   
                    String cookieName = cookie.getName();
                    if ("username".equals(cookieName)){
   
                        String cookieValue = cookie.getValue();
                        if ("admin".equals(cookieValue)){
   
                            resp.sendRedirect("/home.jsp");//重定向到主页
                        }
                    }
                }
            }else{
   
                resp.sendRedirect("/login.jsp");
            }
        }
    }
}

2.5.2.显示用户最后访问该应用的时间

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值