【JavaEE】使Cookie与Session失效-Servlet上传文件操作-优化表白墙

news2025/2/1 12:10:17

表白墙退出登录操作-表白墙注册上传头像+登录显示头像功能

在这里插入图片描述

文章目录

  • 【JavaEE】使Cookie与Session失效-表白墙退出登录操作-Servlet上传文件操作-表白墙注册上传头像+登录显示头像功能
    • 1. Cookie与Session的删除
      • 1.1 表白墙页面增加登录出口
      • 1.2 点击链接退出登录
      • 1.3 测试
    • 2. 上传文件
      • 2.1 后端对上传文件的处理
        • 2.1.1 HttpServletRequest 类方法
        • 2.1.2 Part 类方法
        • 2.1.3 操作
        • 2.1.5 Image类
        • 2.1.4 Save类
        • 2.1.5 注册按钮
      • 2.2 前端设计
        • 2.2.1 form提交文件
        • 2.2.2 js代码
        • 2.2.3 补充:登录页头像显示
    • 3. 登录页面提供注册与忘记密码按钮
      • 3.1 注册按钮
      • 3.2 忘记密码
    • 4. 测试

【JavaEE】使Cookie与Session失效-表白墙退出登录操作-Servlet上传文件操作-表白墙注册上传头像+登录显示头像功能

1. Cookie与Session的删除

Cookie与Session基础博客:【JavaEE】Cookie与Session的前后端交互-表白墙登录设计_s:103的博客-CSDN博客

  • 虽然Cookie和Session都是暂时存在的,不久就会被删掉,但是我们要退出登录的时候,就不能等待其自然消除了~
    • 因为点击退出登录之后,到达登录页面,如果这个时候,浏览器和服务器保留了Cookie和Session,就会自动登录了~
    • (用户自己手动删Cookie,不现实)

这里就是一个固定的做法了:

  • 一些东西是固定的,目前看不懂也没事,不是本文章重点

在这里插入图片描述

  • 创建一个新的Servlet程序:Remove(/remove)
    • 注解的斜杠一定不要忘,不仅仅是这个程序会出错,而是整个项目全部出错!
  1. 获取Session,调用invalidate => 使session这个小哈希表无效

  2. 获取Cookie,Cookie对象不是哈希表,而是一个键值对对象,而报文的Cookie里包含很多键值对(甚至key可以重复)

    • getCookies方法获取请求的Cookie所有键值对,返回Cookie数组
    • 遍历数组,找到key为login,pwd,id的键值对,将cookie的寿命改为0,并通过响应发回浏览器(调用addCookie方法)
  3. 重定向

当其实,只要打断其中的一条路,就可以打破登录状态了(使Cookie失效/使Session失效)

简单了解:

Cookie不仅仅有名字和值两个属性,还有域(domain)、路径(path)等属性。其中,不同的域、不同的路径下可以存在同样名字的cookie。一般我们设置cookie的方法是用一个同样名字、一个值。这时就一定要搞清楚你要设置的cookie的域和路径,否则就会产生问题中的情况。

Cookie机制其实还可以存储很多其他的信息,但在本文章不做研究,暂时用不到

1.1 表白墙页面增加登录出口

在这里插入图片描述

在wall.html(表白墙html)添加导航栏和登录出口:

在这里插入图片描述

  • 没错,用到的css修饰,一样是照抄博客系统的:(common.css中)

在这里插入图片描述

  • 头像是默认的头像(这里为什么是用户的头像,后文提到)

在这里插入图片描述

在这里插入图片描述

1.2 点击链接退出登录

  1. 跳转到登录页面
  2. 调用remove函数发送请求给服务器,使Session/Cookie失效

在这里插入图片描述

1.3 测试

在这里插入图片描述

2. 上传文件

  • 这里只讲解一种:通过form表单的file类型input按钮上传,submit按钮提交

先看成品(预计效果):

在这里插入图片描述
在这里插入图片描述

  • 我们现在已经具备了登录的功能,但是我们也需要注册的功能,才能让用户使用看到的表白墙有他们的特性~
    • 登录设计博客:【JavaEE】Cookie与Session的前后端交互-表白墙登录设计_s:103的博客-CSDN博客
    • 在此基础上,增加头像显示的功能(当输入了用户名,且点击了密码框的情况下)

设计稿:
在这里插入图片描述

数据库表的设计:

  • 表名为image
    1. 用户名
    2. 文件名

在这里插入图片描述

2.1 后端对上传文件的处理

2.1.1 HttpServletRequest 类方法

方法描述
Part getPart(String name)获取请求中给定 name 的文件
Collection getParts()获取所有的文件

2.1.2 Part 类方法

方法描述
String getSubmittedFileName()获取提交的文件名
String getContentType()获取提交的文件类型
long getSize()获取文件的大小
void write(String path)把提交的文件数据写入磁盘文件

高亮的为本文的重点方法~

2.1.3 操作

在这里插入图片描述

对于确认按钮,点击它就是触发了form表单的提交,将用户名和头像一同提交给服务器

  • 细节:由于form的编码是特定的编码,如果在后端以utf8去理解,会报错,所以只有在用户名不为中文或者什么特殊字符的时候才能正常的与头像进行绑定~
    • 中文虽然不会导致文件上传失败,但是这个中文用户名不会绑定到头像,也就是说此后这个账号将只显示默认的头像,而不是自己的头像

而form在这里提交的应该是post请求,其中的正文(用户名)可以用getParameter去获取

@MultipartConfig
@WebServlet("/reg")//form表单提交~
public class Register extends HttpServlet {
    //Part为一个Servlet提供
    //在这里确定这张照片是否应该存入数据库

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part part = req.getPart("file");
        String fileName = part.getSubmittedFileName();
        part.write("D:\\马库\\mara-circle-june-2023\\showLove\\src\\main\\webapp\\" + fileName);
        String username = req.getParameter("name");
        resp.setContentType("text/html; charset=utf8");
        if(Save.isExistence("users", username) || Save.isExistence("image", username)) {
            resp.getWriter().write("<h1>已存在!</h1>");
        }else {
            Save.insert("image", username, fileName);
            resp.getWriter().write("<h1>提交成功!</h1>");
        }
    }
}

解析:

在这里插入图片描述

write方法是直接写道硬盘上,建议不要使用相对路径,因为其默认的当前目录不是我们的项目目录~

  • 后面的文件名可以写自己的,但是尽量不要该文件的类型

2.1.5 Image类

点击密码输入框发送请求获取头像的操作:

@WebServlet("/image")
public class Image extends HttpServlet {

    ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf8");
        User img = objectMapper.readValue(req.getInputStream(), User.class);
        //不能处理一个只有一个成员的类!
        String username = img.name;
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Loves?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("mmsszsd666");//这是俺的微信号,欢迎添加,相互学习!
        try {
            Connection connection = dataSource.getConnection();
            String sql = "select * from image where name = '" + username + "';";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);

            //这里的Set并不是,对象为Love的Set集合,而是一个迭代器!
            ResultSet set = preparedStatement.executeQuery();
            //迭代他(是next方法而不是hasNext)
            if(set.next()) {
                resp.getWriter().write(set.getString("fileName"));
            }else {
                resp.getWriter().write("No");
            }
            set.close();
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
  • 若数据库中并没有这个头像,返回No~

2.1.4 Save类

  • 这个类是我自己包装的类,包装了:
    1. 在数据库中查询用户名是否注册过
    2. 在数据库中查询用户名是否与头像绑定国
    3. 给数据库的一张表中插入键值对
    4. 通过用户名获取图片

其中第一和第二为此方法:

//传入表的名字,和username
public static boolean isExistence(String tableName, String username) {
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Loves?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource) dataSource).setUser("root");
    ((MysqlDataSource) dataSource).setPassword("mmsszsd666");//这是俺的微信号,欢迎添加,相互学习!
    boolean ret = false;
    try {
        Connection connection = dataSource.getConnection();
        String sql = "select * from " + tableName + " where name = '" + username + "';";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //这里的Set并不是,对象为Love的Set集合,而是一个迭代器!
        ResultSet set = preparedStatement.executeQuery();
        //迭代他(是next方法而不是hasNext)
        ret = set.next();
        set.close();
        preparedStatement.close();
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return ret;//true 存在,false不存在

}

在这里插入图片描述

第三为此方法:

public static void insert(String tableName, String key, String value) {
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Loves?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource)dataSource).setUser("root");
    ((MysqlDataSource)dataSource).setPassword("mmsszsd666");//这是俺的微信号,欢迎添加,相互学习!
    Connection connection = null;
    try {
        connection = dataSource.getConnection();
        String sql = "insert into " + tableName + " values(?, ?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1, key);
        preparedStatement.setString(2, value);
        preparedStatement.executeUpdate();
        preparedStatement.close();
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

在这里插入图片描述

第四为此方法:

public static String getImage(String username) {
    DataSource dataSource = new MysqlDataSource();
    ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Loves?characterEncoding=utf8&useSSL=false");
    ((MysqlDataSource) dataSource).setUser("root");
    ((MysqlDataSource) dataSource).setPassword("mmsszsd666");//这是俺的微信号,欢迎添加,相互学习!
    String ret = null;
    try {
        Connection connection = dataSource.getConnection();
        String sql = "select * from image where name = '" + username + "';";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //这里的Set并不是,对象为Love的Set集合,而是一个迭代器!
        ResultSet set = preparedStatement.executeQuery();
        //迭代他(是next方法而不是hasNext)
        if(set.next()) {
            ret = set.getString("fileName");
        }else {
            ret = "https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300";
        }
        set.close();
        preparedStatement.close();
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return ret;
}
  • 与isExistence不同的是,此方法返回一个文件名
    1. 找得到:返回文件名
    2. 找不到:返回默认头像

注意:由于我直接将头像保存到了webapp目录下,所以直接用用户名就可以访问到

所以刚才的 form表单请求处理操作中的这一段的解释为:

  • 在这里千万不能改编码为utf8,会报500!

在这里插入图片描述

2.1.5 注册按钮

在这里插入图片描述

Save类本身也是个Servlet程序~

ObjectMapper objectMapper = new ObjectMapper();

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    User user = objectMapper.readValue(req.getInputStream(), User.class);
    resp.setContentType("text/html; charset=utf8");
    String username = user.name;//获取key对应值
    String password = user.password;
    if(isExistence("users", username)) {
        resp.getWriter().write("No");//存在此用户了!
    }else {
        insert("users", username, password);
    }
}
  1. 存在此用户,返回No
  2. 不存在则注册成功,在users中插入用户信息

2.2 前端设计

  • 这个页面几乎照搬登录页面,只是增加了一些元素罢了~
  • 用的css也直接用logIn.css和common.css

不包含js代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>注册页</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <link rel="stylesheet" href="common.css" />
    <link rel="stylesheet" href="logIn.css" />

    <style>
      #i {
        transition: all 0.618s;
        opacity: 61.8%;
      }
      #i:hover {
        opacity: 100%;
      }
    </style>
  </head>
  <body>
    <div class="navigation">
      <!-- 头像 -->
      <img
        src="https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300"
        alt="未登录"
      />
      <div class="title">未登录</div>
      <div class="space"></div>

      <a href="login.html" onclick="remove()">登录</a>
    </div>
    <!-- 登录页面 -->

    <div class="login-Container">
      <div class="dialog">
        <h3>注册</h3>

        <form
          target="_blank"
          action="reg"
          method="POST"
          enctype="multipart/form-data"
        >
          <div id="fileImage">
            <input id="i" type="button" value="请上传头像" onclick="judge();" />
            <input type="file" name="file" style="display: none" />
            <div id="conf">
              <input
                type="submit"
                value="确认"
                id="co"
                onclick="alert(
                '如果你需要上传头像,则需要注意以下几点\n' +
                  '1. 点击右侧的确认按钮后,此用户名将无法更改头像!\n' +
                  '2. 用户名应为英文字符,否则虽然注册成功但是头像无法与您进行匹配!\n' +
                  '3. 若用户名已被注册过或者已绑定头像,则无法正常注册!\n' + 
                  '4. 只有填写用户名后才能上传图片,只有上传了图片才能点击确认,否则会出错\n'
              );"
              />
            </div>
          </div>

          <div class="row">
            <label for="username">用户名</label>
            <input type="text" id="username" name="name" />
          </div>
        </form>

        <div class="row">
          <label for="password">密码</label>
          <input type="password" id="password" onclick="getImage()" />
        </div>
        <div class="r">
          <input type="submit" id="submit" value="注册" onclick="reg()" />
        </div>
      </div>
    </div>
  </body>
</html>

改动1:头像触摸变化

在这里插入图片描述

改动2:头像和按钮

  • form包住了头像和用户名输入框
  • 在确认的时候做一些提示~
  • 登录 -> 注册

在这里插入图片描述

改动3:对新增元素进行css修饰

#fileImage {
    display: flex;
    justify-content: center;
    align-items: center;
    justify-content: space-around;
}
#conf {
    display: flex;
    justify-content: center;
    align-items: center;
}
#co {
    width: 100px;
    height: 50px;
    color: rgba(255, 255, 255, 0.618);
    font-weight: 900;
    background-color: rgb(251, 114, 153);
    line-height: 50px;
    text-align: center;
    border-radius: 30px;
    border: none;
    transition: all 0.618s;
}
#co:hover {
    background-color: rgb(101, 94, 252);
    color: rgba(0, 0, 0, 0.618);
}

#i {
    width: 200px;
    height: 200px;
    border-radius: 100px;
    background-image: url(https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300);
    background-repeat: no-repeat;
    background-position: center center;
    background-size: cover;
    border: rgba(251, 114, 153, 0.5) 2px solid;
}

改动4:对其他元素进行微调(不演示)

2.2.1 form提交文件

  • 由于上传文件按钮的样式难以更改,所以我们这里改为一下这种方式
    • 用点击button代替点击上传文件按钮,并且让上传文件按钮消失

在这里插入图片描述

后面搭配一段代码即可

提交form的post请求按钮:

在这里插入图片描述

在这里插入图片描述

2.2.2 js代码

  1. 上传头像要在输入用户名后才能进行(judge函数的非空校验)

在这里插入图片描述

function judge() {
    var name = jQuery("#username");
    var password = jQuery("#password");

    if (name.val().trim() == "") {
        alert("请输入名字");
        name.focus();
        return;
    } else {
        javascript: $("input[name='file']").click();
        jQuery("#i").val("");
    }
}
  1. 确认按钮为form的方式去提交请求的,所以跟js无关~
  2. 点击密码框,显示头像
function getImage() {
    var name = jQuery("#username");
    var password = jQuery("#password");

    if (name.val().trim() == "") {
        alert("请输入名字!");
        name.focus();
        return;
    }
    var keyValue = {
        name: name.val(),
        password: password.val(),
    };
    jQuery.ajax({
        type: "post",
        url: "image",
        contentType: "application/json; charset=utf8",
        data: JSON.stringify(keyValue),
        success: function (body) {
            if (body != "No") {
                jQuery("#i").css("background-image", "url(" + body + ")");
                jQuery("#i").val("");
            } else {
                jQuery("#i").css(
                    "background-image",
                    "url(https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300)"
                );
                jQuery("#i").val("头像");
            }
        },
    });
}

在这里插入图片描述

  1. 提交注册

在这里插入图片描述

function reg() {
    var name = jQuery("#username");
    var password = jQuery("#password");
    if (name.val().trim() == "") {
        alert("清输入名字!");
        name.focus();
        return;
    }
    if (password.val().trim() == "") {
        alert("清输入密码!");
        password.focus();
        return;
    }
    var keyValue = {
        name: name.val(),
        password: password.val(),
    };

    jQuery.ajax({
        type: "post",
        url: "save",
        contentType: "application/json; charset=utf8",
        data: JSON.stringify(keyValue),
        success: function (body) {
            if (body == "No") {
                alert("用户存在");
                name.val("");
                password.val("");
                name.focus();
                jQuery("#i").css(
                    "background-image",
                    "url(https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300)"
                );
            } else {
                alert("注册成功");
                window.location.href = "login.html";
            }
        },
    });
}

2.2.3 补充:登录页头像显示

  • 原理一致~

在这里插入图片描述

3. 登录页面提供注册与忘记密码按钮

在这里插入图片描述

  • 源码直接在码云看就行了~

3.1 注册按钮

简单的跳转~

在这里插入图片描述

3.2 忘记密码

  • 忘记密码特别简单,就是直接在数据库里拿到密码,然后返回给输入框~
function toGetPassword() {
    var name = jQuery("#username");
    var password = jQuery("#password");
    if (name.val().trim() == "") {
        alert("请输入是谁!");
        name.focus();
        return;
    }
    var keyValue = {
        name: name.val(),
        password: password.val(),
    };
    jQuery.ajax({
        type: "POST",
        url: "remind",
        contentType: "application/json; charset=utf8",
        data: JSON.stringify(keyValue),
        success: function (body) {
            if (body != "No") {
                jQuery("#password").val(body);
            } else {
                alert("不存在这个用户!");
            }
        },
    });
}

后端中(新的servlet类 Remind):

@WebServlet("/remind")
public class Remind extends HttpServlet {

    ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user = objectMapper.readValue(req.getInputStream(), User.class);
        resp.setContentType("text/html; charset=utf8");
        String name = user.name;
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Loves?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("mmsszsd666");//这是俺的微信号,欢迎添加,相互学习!
        try {
            Connection connection = dataSource.getConnection();
            String sql = "select * from users where name = '" + name + "';";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet set = preparedStatement.executeQuery();
            if(set.next()) {
                resp.getWriter().write(set.getString("password"));
            }else {
                resp.getWriter().write("No");
            }
            set.close();
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

4. 测试

登录与退出登录测试:

在这里插入图片描述

注册测试:

在这里插入图片描述

重复注册测试:

在这里插入图片描述


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

表白墙即将到达尾声,最后一步就是优化“甜言蜜语”的显示了!

码云链接:代码

敬请期待(^-^)V


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java线程池详解】—— 每天一点小知识

&#x1f4a7; J a v a 线程池 \color{#FF1493}{Java线程池} Java线程池&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x1f…

2023-6-10-第一式工厂方法模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

安卓与串口通信-数据分包的处理

前言 本文是安卓串口通信的第 5 篇文章。本来这篇文章不在计划内&#xff0c;但是最近在项目中遇到了这个问题&#xff0c;正好借此机会写一篇文章&#xff0c;在加深自己理解的同时也让大伙对串口通信时接收数据可能会出现分包的情况有所了解。 其实关于串口通信会可能会出现…

编译tolua——3、以pbc为例子,添加第三方库

目录 1、编译工具和环境说明 2、基础编译tolua 3、以pbc为例子&#xff0c;添加第三方库 4、更新luaJit 大家好&#xff0c;我是阿赵。 之前分享过怎样正常编译基础版本的tolua。这次用添加pbc为例&#xff0c;看看怎样往tolua里面添加其他的第三方库。知道了方法之后&#xf…

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好&#xff0c;我是郭东白。上节课我们讲了为什么要做阶段性的价值交付&#xff0c;以及进入阶段性价值交付环节的准备工作。有了这些学习基础&#xff0c;这节课我们就可以进行阶段性价值交付了。 在交付的过程中&#xff0c;主要有三部分工作&#xff1a;目标分解、定义交…

SLAM十四讲——ch4实践(李群李代数)

视觉SLAM14讲----ch4的操作及避坑 一、ch4的实践的准备工作二、各个实践操作1. Sophus的基本使用方法2. 例子&#xff1a;评估轨迹误差 三、遇到的问题 一、ch4的实践的准备工作 确保已经有Sophus库&#xff0c;Sophus库是一个较好的李代数库。 注意&#xff1a; 开始时slamb…

MySQL 数据库实用指南:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏&#xff0c;本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书&#xff0c;小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结&#xff1a;文末赠书 一、准备测…

Linux之进程间通信——system V(共享内存、消息队列、信号量等)

文章目录 前言一、共享内存1.共享内存的基本原理2.共享内存的创建3.共享内存的控制参数返回值共享内存的内核数据结构 4.共享内存的关联参数 5.共享内存的去关联6.查看IPC资源7.查看共享内存8.删除共享内存 二、实现进程间通信&#xff08;代码&#xff09;三、共享内存的特点四…

【Newman+Jenkins】实施接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子&#xff0c;哈哈&#xff0c;开玩笑啦。。。别当真&#xff0c;简单地说Newman就是命令行版的Postman&#xff0c;查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行&#xff0c;把Postman界面化运…

软件测试—冒烟测试

1. 核心 冒烟测试就是完成一个新版本的开发后&#xff0c;对该版本最基本的功能进行测试&#xff0c;保证基本的功能和流程能走通。 如果不通过&#xff0c;则打回开发那边重新开发&#xff1b; 如果通过测试&#xff0c;才会进行下一步的测试(功能测试&#xff0c;集成测试…

【ThreadLocal为什么可能内存泄漏?】 —— 每天一点小知识

&#x1f4a7; T h r e a d L o c a l 为什么可能内存泄漏&#xff1f; \color{#FF1493}{ThreadLocal为什么可能内存泄漏&#xff1f;} ThreadLocal为什么可能内存泄漏&#xff1f;&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个…

渗透测试综合实验

文章目录 一、前期交互二、信息搜集三、威胁建模五、渗透攻击1.弱口令攻击2.SQL注入3.不安全文件上传 六、后渗透攻击利用1.蚁剑安装2.一句话木马利用 七、漏洞报告 一、前期交互 二、信息搜集 使用nmap收集端口、域名、后台信息 目标IP nmap -O -sV IP 三、威胁建模 寻…

基于javaweb jsp+servlet实验室设备管理系统的设计与实现

一.项目介绍 本系统分为 超级管理员、老师、学生三类角色 超级管理员&#xff1a;通知管理、维护用户信息、实验室管理&#xff08;负责维护实验室、预约实验室&#xff09;、设备管理&#xff08;维护技术参数、维护运行数据、维护电子文档&#xff09;、设备维修管理&am…

第5章 总体设计

第5章 总体设计 总体设计是决定”怎样做”。也就是概括的说&#xff0c;系统应该如何实现&#xff0c;因此总体设计也被称作概要设计。 5.1 设计过程 例题 5.2 设计原理 5.2.1 模块化 模块是由边界元素限定的相邻程序元素&#xff08;例如&#xff0c;数据说明&#xff0c;…

【Spring Boot】Spring Boot特点及重要策略,含安装步骤详细讲解

前言 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发展的快速应…

Matplotlib 绘制多图

Matplotlib 绘制多图 我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。 subplot() 方法在绘图时需要指定位置&#xff0c;subplots() 方法可以一次生成多个&#xff0c;在调用时只需要调用生成对象的 ax 即可。 subplot subplot(nrows, ncols, inde…

微服务_Nacos

简介 Nacos&#xff08;全称为“动态服务发现、配置和服务管理平台”&#xff09;是阿里巴巴开源的一款云原生服务发现和配置管理平台&#xff0c;支持多种语言和多种环境&#xff0c;包括Kubernetes、Docker、Spring Cloud等常见的云原生环境。它提供了服务发现、配置管理、服…

MFC的定义和实际操作方法

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天从另一个角度来看一下MFC。 完整的应用一般由四个类组成&#xff1a;CWinApp应用类&#xff0c;CFrameWnd窗口框架类&#xff0c;CDocument文档类&#xff0c;CView视类 过程&#xff1a;CWinApp创建CF…

算法刷题-链表-反转链表

反转链表 206.反转链表思路C代码双指针法递归法其他语言版本使用虚拟头结点解决链表翻转使用栈解决反转链表的问题 反转链表的写法很简单&#xff0c;一些同学甚至可以背下来但过一阵就忘了该咋写&#xff0c;主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 …

【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…