JavaWeb项目——如何处理管理员登录和退出——笔记
一、知识点
1、@WebServlet注解的使用
@WebServlet注解是Servlet 3.0引入的一个特性,它允许开发者在Servlet类上使用注解来声明Servlet的一些属性,从而避免在web.xml文件中进行配置。这种方式简化了Servlet的配置过程,使得代码更加简洁,易于理解和维护。
1)示例代码
使用@WebServlet注解非常简单,只需要在Servlet类上方添加注解,并指定URL模式。例如,要映射到/login.do的URL,可以这样写:
@WebServlet(urlPatterns = {"/login"})public class LoginServlet extends HttpServlet {// ... 类的实现}
这个注解告诉Servlet容器,当请求到达/login.do时,应该使用LoginServlet类来处理该请求。
2)重要注意事项
在使用**@WebServlet**注解时,有几个重要的注意点需要遵守:
-
确保在web.xml中设置metadata-complete="false",这样Servlet容器才会扫描注解。
-
如果使用了注解方式,就不应该再在web.xml中对同一个Servlet进行配置。
-
在注解的URL模式中,不要忘记前面的斜杠/。
2、销毁session时,removeAttribute()和invalidate()有何区别?
做我们在用户登陆功能时,用户退出时用到的是session.invalidate()
而在比对验证码时,用到的是session.removeAttribute("某个名字")。
invalidate时销毁,作废的意思。
1)二者比较
session.removeAttribute("") 用于清空session中某个特定的属性值
session.livadate() 则是清除当前整个session
1、removeAttribute() 就是从session删除指定名称的绑定对象,也就是说调用此方法后再调用getAttribute(Stringname)时,不能获取指定名称的绑定对象,但是session还存在。
2、invalidate() 就是销毁此session对象,session对象中绑定的那些对象值也都不存在了。
session.invalidate()是销毁跟用户关联session,例如有的用户强制关闭浏览器,而跟踪用户的信息的session还存在,可是用户已经离开了。
虽然session 生命周期浏览默认时间30分,但是在30分钟内别的用户还可以访问到前一个用户的页面,需销毁用户的session。
session.removeAttribute()移除session中的某项属性。
==>在用户登陆中,用户退出时执行的是 request.getSession().removeAttribute("userSession");
session被销毁了,注销用户,可以使session失效。
==>验证验证码时,获取到session中的验证码后,用的是removeAttribute
是清空当前session中指定的属性,下个request中的sessionID是不变的
也就是说,session还是原来的session
(参考链接:https://blog.csdn.net/u012471009/article/details/79702145)
3、什么是三层架构?
1)分析
我们往往使用一个Dao接口隐藏持久化操作的细节,业务对象不需要了解底层的数据库持久化知识。使得业务逻辑与持久化逻辑分离,业务逻辑通常关系的是应用程序的核心流程和业务规则,持久化逻辑关注的是如何访问和操作持久化数据。
表示层: JSP/Servlet
业务逻辑层: 业务规则
持久化层: 主要包装持久化的逻辑
分层主要目的是为了好管理,能更好的适应需求的变换,能够更好的进行人员分工。
如图所示:
2)通俗理解为什么要使用三层架构:
假如你要开一家奶茶店,用开奶茶店的过程来类比三层架构会很容易理解。整个三层架构就像是店里不同分工的工作人员,共同协作完成顾客购买奶茶的任务。
表现层 (UI 层,User Interface):
这一层就好比奶茶店的前台工作人员。顾客走进店里,和前台交流,告诉前台自己想要什么口味的奶茶,要大杯还是小杯,加不加珍珠、椰果等配料。前台工作人员把顾客的这些要求记录下来,然后将做好的奶茶递给顾客,让顾客看到并拿到最终的产品。在软件系统里,表现层就是用户能直接看到和操作的部分,比如手机 APP 的界面、电脑网页的页面等,负责接收用户的输入,比如点击按钮、填写信息,再把系统处理后的结果展示给用户,像显示查询到的信息、操作的反馈等。
业务逻辑层(BLL 层,Business Logic Layer):
相当于奶茶店的制作团队负责人。当前台工作人员把顾客的需求传达过来后,制作团队负责人要根据店里的配方和流程来安排制作。比如顾客要一杯波霸奶茶,负责人要确定珍珠的量、奶茶的配比,还要考虑店里的原料库存够不够,如果不够要及时补货等。在软件系统中,业务逻辑层接收表现层传递过来的用户请求,按照设定好的业务规则进行处理。比如在一个电商系统中,计算商品折扣、判断用户的订单是否符合优惠条件、处理退货退款等逻辑,都是业务逻辑层的工作。它会调用数据访问层获取或保存数据,再把处理结果返回给表现层。
数据访问层(DAL 层,Data Access Layer):
就像是奶茶店的仓库管理员。制作团队需要原料时,仓库管理员负责从仓库中取出相应的原料给他们;当采购了新的原料回来,仓库管理员要把原料妥善存放到仓库里。在软件系统中,数据访问层主要负责和数据库打交道。当业务逻辑层需要获取数据,比如查询用户信息、商品信息时,数据访问层就从数据库中把数据取出来;当业务逻辑层需要保存数据,比如新用户注册信息、新订单信息时,数据访问层就把这些数据存入数据库。它为业务逻辑层提供了数据访问的功能,让业务逻辑层不用关心具体怎么连接数据库、怎么执行 SQL 语句等细节。
通过这种三层架构的分工,整个系统就像奶茶店一样,各个部分各司其职,既方便维护和管理,也能更高效地满足用户的需求。
3)dao层和service层的区别和联系
在常见的三层架构中,DAO(Data Access Object,数据访问对象)层和 Service(业务逻辑)层是两个重要的组成部分。
职责区别:
DAO 层:这一层主要负责与数据库进行交互,就像图书馆里专门管理藏书仓库的工作人员。它的任务是执行对数据库的增、删、改、查操作。比如在图书馆管理系统中,当需要添加一本新书的信息到系统中,DAO 层会执行向数据库插入新数据的操作;如果要查询某本图书的借阅记录,DAO 层会从数据库中查询相关数据并返回。它不关心这些数据在业务上的具体用途,只专注于如何准确地从数据库获取数据或者将数据保存到数据库。
Service 层:它更像是图书馆的借阅服务台工作人员,负责处理业务逻辑。比如在图书馆管理系统中,当读者要借阅一本书时,Service 层会先调用 DAO 层查询这本书当前是否在库、读者是否有超期未还的书籍等情况,然后根据这些条件判断是否允许借阅。如果允许,再调用 DAO 层更新书籍的借阅状态和读者的借阅记录。Service 层会综合考虑多个因素和业务规则,将不同的 DAO 层操作组合起来,以完成一个完整的业务功能。
依赖关系:
Service 层依赖于 DAO 层。Service 层在处理业务逻辑的过程中,需要获取或保存数据时,会调用 DAO 层提供的方法。就像借阅服务台工作人员在处理借阅业务时,需要从管理藏书仓库的工作人员那里获取书籍状态和读者借阅记录等信息。而 DAO 层并不依赖 Service 层,它只专注于数据库操作,为上层提供数据访问服务。
设计目的区别:
DAO 层的设计目的是为了实现数据访问的封装,使得数据库操作与业务逻辑分离,提高数据访问的可维护性和可复用性。比如,当数据库从 MySQL 换成 Oracle 时,只需要修改 DAO 层的代码,而不影响业务逻辑。Service 层的设计目的是为了实现业务逻辑的封装,将复杂的业务流程进行抽象和组织,提高业务逻辑的可扩展性和可维护性。例如,当图书馆新增一种借阅规则时,只需要在 Service 层修改相应的业务逻辑代码即可。
综上所述,DAO 层和 Service 层在三层架构中相互协作,DAO 层为 Service 层提供数据支持,Service 层利用 DAO 层完成业务逻辑处理,共同保证系统的正常运行。
二、模拟管理员登录和退出 小demo
1、login界面代码
<%--Created by IntelliJ IDEA.User: 34524Date: 2024/8/11Time: 21:40To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css"/><script src="${pageContext.request.contextPath}/js/bootstrap.bundle.min.js"></script><script src="${pageContext.request.contextPath}/js/jquery-3.7.1.min.js"></script><title>Login</title><link rel="icon" href="${pageContext.request.contextPath}/img/favicon.ico" sizes="16X16"/><style type="text/css">body {background-image: url("${pageContext.request.contextPath}/img/login.jpg");background-repeat: no-repeat;background-size: cover;}#loginform {border: 2px solid gray;padding: 20px;border-radius: 10px;animation-name: rain;animation-duration: 600s;animation-direction: alternate;animation-timing-function: linear;animation-iteration-count: infinite;}#loginform:hover {transition: 0.7s;border: 2px solid white;}@keyframes rain {0%{box-shadow: 0px 0px 25px gold;}10%{box-shadow: 0px 0px 25px lime;}20%{box-shadow: 0px 0px 25px deepskyblue;}30%{box-shadow: 0px 0px 25px blue;}40%{box-shadow: 0px 0px 25px purple;}50%{box-shadow: 0px 0px 25px deeppink;}60%{box-shadow: 0px 0px 25px purple;}7%{box-shadow: 0px 0px 25px blue;}80%{box-shadow: 0px 0px 25px deepskyblue;}90%{box-shadow: 0px 0px 25px lime;}100%{box-shadow: 0px 0px 25px gold;}}</style>
</head><body>
<div class="container-fluid"><div class="row"><div class="col-7 pt-5"><div class="row"><div class="col-1"></div><div class="col-3"><a href="${pageContext.request.contextPath}/index.jsp"><img src="${pageContext.request.contextPath}/img/"/></a></div><div class="col-8"><p style="padding-top: 200px;color: white; font-size: 3em;">用美图分享快乐!</p></div></div></div><div class="col-3 pt-5 mt-5"><form method="post" action="${pageContext.request.contextPath}/login" id="loginform"><h2 class="text-center text-light">欢迎登录</h2><div class="form-group mb-2"><label for="username" class="text-white">用户名</label><input type="text" class="form-control" name="username" id="username" value="${cookie.yhm.value}" aria-describedby="usernameHelp"><small id="usernameHelp" class="form-text text-light"></small></div><div class="form-group mb-3"><label for="password" class="text-white">Password</label><input type="password" class="form-control" id="password" name="password" aria-describedby="passwordHelp"><small id="passwordHelp" class="form-text text-light"></small></div><div class="form-group form-check mb-2"><input type="checkbox" class="form-check-input" id="Check1" name="remember" value="1"><label class="form-check-label text-warning" for="Check1">记住用户名</label></div><div class="form-group form-check mb-2"><input type="checkbox" class="form-check-input" id="Check2" ><label class="form-check-label text-warning" for="Check2">管理员登录</label></div><div class="row mb-4"><div class="col-8"><input type="text" class="form-control" placeholder="填写验证码" name="captcha" id="captcha"></div><div class="col-4"><!-- TODO:验证码一般是个图片!!!! 也可以是纯文字 --><%--<button class="btn btn-info" style="letter-spacing: 0.5em;">45TE</button>--%><img id="captchaImg" src="${pageContext.request.contextPath}/captcha" width="100px" height="40px"/><!-- 每一次点击的时候,改变路径 用JS--></div></div><div class="row mb-2"><div class="col-4"><button type="submit" class="btn btn-primary btn-block">登录</button></div><div class="col-4"><a class="btn btn-warning btn-block" href="${pageContext.request.contextPath}/register.jsp">去注册</a></div><div class="col-4"><a class="btn btn-secondary btn-block" href="${pageContext.request.contextPath}/index.jsp">返回首页</a></div></div></form></div><div class="col-2"></div></div>
</div><!-- 界面:这是一个toast功能:弹窗,弹出一个弹框,表示你成功登陆了或者是失败登陆了用法:<small></small>里边写的是弹出的表示时间的信息<div></div>后边一个div表示的是弹框里边的文字内容<div></div>的class里边可以改变toast出现的位置如何触发toast事件:要求: 会用就行,主要是知道这么一个东西,知道在哪里可以改变它的样式
--><div class="toast-container position-fixed top-0 end-0 p-3"><div id="liveToast" class="toast" role="alert" aria-live="assertive" aria-atomic="true"><div class="toast-header"><img src="${pageContext.request.contextPath}/img/favicon.ico" class="rounded me-2" alt="..."><strong class="me-auto">Illey练习</strong><small>现在</small><button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button></div><!-- 思路和作用:这里我们应该判断一下,然后再来写div里边的文本数据其实根本不需要判断,由于你登陆成功或者失败,你肯定得告诉给程序里边得其他对象,所以会把失败信息放到一个作用域里边直接取这个作用域里边的文本,再来判断这个toast显示不显示就行了<--------取作用域的文本时,使用javascript--><div class="toast-body">${param.m==8?"重新登陆":" "}${requestScope.msg}${param.t==0?"已安全退出":''}${param.t==9?"注册成功请登录!":" "}</div></div>
</div><!-- 要实现功能:判断toast-body里边的text文本究竟是不是存在,然后再判断是否显示toast入参:无入参方法体:1.用$()占位符获取toast-body2.使用text()函数,获得里边的文本变量3.判断文本内容是否为空或者大于0,如果里边有文本,说明就是登陆失败4.先获取livetoast对象5.然后再通过 new bootstrap.toast 来获取相应的toast变量6.最后用那个toast的show方法,呈现toast的形式和内容
-->
<script>/* 两个都弹了,说明没有问题*/$(function(){/*$(".可以识别的 没问题 ")*/let text=$(".toast-body").text();if (text!=null && text.length>0) {let toastLiveExample = document.getElementById("liveToast");/* 大小写 写错了 livetoast liveToast */let toast = new bootstrap.Toast(toastLiveExample);toast.show();}let old =$("#captchaImg").attr("src");//每当点击图片时,修改 src路径 浏览器就会发出新的请求$("#captchaImg").click(function () {let n=Math.random();$("#captchaImg").attr("src",old+"?n="+n);/*console.log($("#captchaImg").attr("src"))*/})})$("#Check2").change(function(){if($("#Check2").prop("checked")){$("#loginform").attr("action","${pageContext.request.contextPath}/login2");}else{$("#loginform").attr("action","${pageContext.request.contextPath}/login");}})
</script></body>
</html>
登录界面展示:
在这里的登录我是利用了JavaScript让提交的时候action随之改变
勾选管理员登录之前:
勾选管理员登录之后:
2、/login2 的servlet代码处理
package com.illley.controller;import com.illley.bean.Manager;
import com.illley.service.ManagerService;
import com.illley.service.impl.ManagerServiceImpl;
import org.springframework.dao.EmptyResultDataAccessException;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(urlPatterns = {"/login2"})
public class Login2Controller extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//get 处理 退出HttpSession session = req.getSession();//就是要把session会话里边的manager的attribute使他失效//然后再转发页面session.removeAttribute("manager");session.invalidate();resp.sendRedirect(req.getContextPath()+"/login.jsp?t=0");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//什么管理员显示什么页面 所以还要查询管理员的角色 而且每一个角色对应一个资源动作 有多表关联//管理员表 角色表 操作资源 角色和资源 多对多String username =req.getParameter("username");String password =req.getParameter("password");//管理员登陆ManagerService ms =new ManagerServiceImpl();try {Manager success = ms.login(username,password);//System.out.println(success); //这里打印到控制台就中文乱码,然后登录到管理员界面也都是乱码//打印没问题 就应该把它放到会话域中HttpSession session = req.getSession();session.setAttribute("manager",success);resp.sendRedirect(req.getContextPath()+"/main.jsp"); //当前项目下的 main.jp页面} catch (EmptyResultDataAccessException e) {//System.out.println("用户名和密码错误");req.setAttribute("msg","用户名或密码错误");req.getRequestDispatcher("/login.jsp").forward(req, resp);}}}
其实大家要学习的就是doPost和doGet里边是如何处理用户登录和退出的就可以了。
3、其他操作代码
之后还有如何连接数据库,然后利用sql语句进行查找判断该账户是不是在管理员里边,还有javaBean的构建,这里就不详细展示了,等我把这个javaWeb项目学完,会开源这个项目的,大概春节前后左右吧。
三、处理中文乱码问题
其实是我的两个管理员展示页面最前面忘了加这么一句话
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
这样最后展示的页面就是正常的中文
如图所示:
相关文章:
JavaWeb项目——如何处理管理员登录和退出——笔记
一、知识点 1、WebServlet注解的使用 WebServlet注解是Servlet 3.0引入的一个特性,它允许开发者在Servlet类上使用注解来声明Servlet的一些属性,从而避免在web.xml文件中进行配置。这种方式简化了Servlet的配置过程,使得代码更加简洁&#…...
函数递归的介绍
1.递归的定义 在C语言中,递归就是函数自己调用自己 上面的代码就是 main 函数在函数主体内 自己调用自己 但是,上面的代码存在问题:main 函数反复地 自己调用自己 ,不受限制,停不下来。 最终形成死递归,…...
昇腾环境ppstreuct部署问题记录
测试代码 我是在华为昇腾910B3上测试的PPStructure。 import os import cv2 from PIL import Image #from paddleocr import PPStructure,draw_structure_result,save_structure_res from paddleocr_asyncio import PPStructuretable_engine PPStructure(show_logTrue, imag…...
《知识图谱:鸿蒙NEXT中人工智能的智慧基石》
在鸿蒙NEXT系统的人工智能应用中,知识图谱技术犹如一座智慧基石,为系统的智能化提供了强大的知识支撑,开启了更智能、更高效、更个性化的交互新时代。 提升语义理解能力 知识图谱以其结构化的知识表示方式,将各种实体和它们之间…...
Springboot项目Jackson支持多种接收多种时间格式
前言 在springboot项目中经常会使用Jackson框架,当前端给后端传输时间类型时,我们一般需要先配置好时间格式,否则后端无法接收。以下是一些配置方法 统一配置 spring:jackson:time-zone: GMT+8date-format: yyyy-MM-dd HH:mm:ss这种配置就是要求前端统一传输的格式是yyyy-…...
go语言zero框架通过chromedp实现网页在线截图的设计与功能实现
在 GoZero 框架中实现网页在线截图的功能,可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包,可以用来在 Go 程序中模拟浏览器操作,如页面截图、DOM 操作、表单提交等。 下面是一个…...
基于深度学习的视觉检测小项目(十四) 用SQLite数据库进行用户管理
在开始做用户管理之前,先要了解一下SQLite数据库的基础知识:https://blog.csdn.net/xulibo5828/category_12785993.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12785993&sharereferPC&sharesourcexulibo5828&sharefrom…...
【2024年华为OD机试】 (B卷,100分)- 敏感字段加密(Java JS PythonC/C++)
一、问题描述 题目描述 给定一个由多个命令字组成的命令字符串: 字符串长度小于等于 127 字节,只包含大小写字母、数字、下划线和偶数个双引号;命令字之间以一个或多个下划线 _ 进行分割;可以通过两个双引号 "" 来标识包含下划线 _ 的命令字或空命令字(仅包含…...
图像去雾数据集的下载和预处理操作
前言 目前,因为要做对比实验,收集了一下去雾数据集,并且建立了一个数据集的预处理工程。 这是以前我写的一个小仓库,我决定还是把它用起来,下面将展示下载的路径和数据处理的方法。 下面的代码均可以在此找到。Auo…...
Vue3数据响应式原理
什么是数据响应式 当数据变化时,引用数据的函数(副作用函数)自动重新执行。 即数据触发了函数的响应,如:视图渲染中使用了某数据,数据改变后,视图跟着自动更新。 触发者:数据 响应者…...
5.最长回文子串--力扣
给你一个字符串 s,找到 s 中最长的 回文子串。 示例 1: 输入:s “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2: 输入:s “cbbd” 输出:“bb” 原题如上&…...
ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT
文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史:从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …...
python学opencv|读取图像(三十九 )阈值处理Otsu方法
【1】引言 前序学习了5种阈值处理方法,包括(反)阈值处理、(反)零值处理和截断处理,还学习了一种自适应处理方法,相关文章链接为: python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客 python学o…...
统信V20 1070e X86系统编译安装mysql-5.7.44版本以及主从构建
设备信息 操作系统版本架构CPU内存备注统信UOS V20 1070eX864C8G此配置仅做编译安装验证,持续运行或数据量增长大请自行评估资源配置。统信UOS V20 1070eX864C8G 资源包 该包包含mysql-5.7.44源码包、boost资源包、统信编译mysql-5.7.44安装包 通过网盘分享的文件…...
麒麟LINUX V10SP3 2401安装ORACLE 12.2.1 runInstaller直接报UNZIP格式不对
好久没有安装ORACLE了,一般都是RHEL上安装得比较多,这不,现在大家都是选择国产操作系统来安装数据库了,以前在龙蜥,欧拉,麒麟上也安装过,都没有问题,想来在麒麟LINUX v10sp3 2401上面…...
10 为什么系统需要引入分布式、微服务架构
java技术的发展 在java开始流行起来之后,主要服务于企业家应用,例如ERP,CRM等等,这些项目是为企业内部员工使用,我们的思维是怎么用设计模式,如何封装代码。让开发人员关注到业务上去,系统也就那么几十几百…...
【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)
目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显,发现可以打SSTI 本地起一个服务,折半查找fuzz黑名单,不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…...
openharmony应用开发快速入门
开发准备 本文档适用于OpenHarmony应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用(如下图所示),快速了解工程目录的主要文件,熟悉OpenHarmony应用开发流程。 在开始之前,您需要了解有关OpenHarmon…...
解决npm install安装出现packages are looking for funding run `npm fund` for details问题
当我们运行npm install时,可能会收到类似以下的提示信息:“x packages are looking for funding.” 这并不是错误提示,也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…...
python助力WRF自动化运行
对大部分人而言,特别是新用户,WRF模式的安装繁琐且不必要,可以作为后续进阶掌握的技能,本学习跳过繁琐的安装步骤,直接聚焦模式的运行部分,通过短平快的教学,快速掌握模式运行。进一步将python语…...
Go-知识 版本演进
Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…...
企业级NoSQL数据库Redis
1.浏览器缓存过期机制 1.1 最后修改时间 last-modified 浏览器缓存机制是优化网页加载速度和减少服务器负载的重要手段。以下是关于浏览器缓存过期机制、Last-Modified 和 ETag 的详细讲解: 一、Last-Modified 头部 定义:Last-Modified 表示服务器上资源…...
Android渲染Latex公式的开源框架比较
对比主流框架,介绍如下几款 1、AndroidMath 官网:https://github.com/gregcockroft/AndroidMath/tree/master 基于android原生view方式渲染 优点:速度快,开源协议 MIT license 缺点:不支持文字公式混合渲染 2、Ma…...
ARM学习(42)CortexM3/M4 MPU配置
笔者之前学习过CortexR5的MPU配置,现在学习一下CortexM3/M4 MPU配置 1、背景介绍 笔者在工作中遇到NXP MPU在访问异常地址时,就会出现总线挂死,所以需要MPU抓住异常,就需要配置MPU。具体背景情况可以参考ARM学习(41)NXP MCU总线挂死,CPU could not be halted以及无法连…...
Sam Altman亲自确认:o3-mini即将上线!GPT和o系列模型合并!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...
数据结构-队列
目录 前言一、队列及其抽象数据类型1.1 队列的基本概念1.2 队列的抽象数据类型 二、队列的实现2.1 顺序表示2.1.1 结构定义2.1.2 基本操作的实现 2.2 链式表示2.2.1 结构定义2.2.2 基本操作的实现 总结 前言 本篇文章介绍队列的基础知识,包括队列的抽象数据类型以及…...
Go Map 源码分析(一)
Go语言中的map是通过哈希表实现的,其底层结构和实现机制如下: 一、hash 结构 hmap结构体:是map的头部结构,主要字段及含义如下: count:表示当前哈希表中的元素数量,与len()函数相对应。flags…...
天机学堂5-XxlJobRedis
文章目录 梳理前面的实现:Feign点赞改进 day07-积分系统bitmap相关命令签到增加签到记录计算本月已连续签到的天数查询签到记录 积分表设计签到-->发送RabbitMQ消息,保存积分对应的消费者:**消费消息 用于保存积分**增加积分查询个人今日积…...
SpringBoot整合junit
SpringBoot 整合 junit 特别简单,分为以下三步完成: 1在测试类上添加 SpringBootTest 注解2使用 Autowired 注入要测试的资源3定义测试方法进行测试 1.实验准备: 创建一个名为 springboot_junit_test 的 SpringBoot 工程,工程目录结构如下…...
Jenkins-pipeline Jenkinsfile说明
一. 简介: Jenkinsfile 是一个文本文件,通常保存在项目的源代码仓库中,用于定义 Jenkins Pipeline 的行为。使用 Jenkinsfile 可以使 CI/CD 流程版本化,并且易于共享和审核。 二. 关于jenkinsfile: jenkins的pipeline…...
SpringMVC 实战指南:打造高效 Web 应用的秘籍
第一章:三层架构和MVC 三层架构: 开发服务器端,一般基于两种形式,一种 C/S 架构程序,一种 B/S 架构程序使用 Java 语言基本上都是开发 B/S 架构的程序,B/S 架构又分成了三层架构三层架构: 表现…...
结合帧级边界检测和深度伪造检测,定位部分伪造音频攻击中的篡改区域
Integrating frame-level boundary detection and deepfake detection for locating manipulated regions in partially spoofed audio forgery 摘要: 部分伪造音频是一种深度伪造的变体,它通过引入伪造或外部来源的善意音频片段来操纵音频语句…...
人工智能之深度学习_[2]-PyTorch入门
文章目录 PyTorch1.PyTorch简介1.1 什么是PyTorch1.2 PyTorch特点1.3 PyTorch发展历史 2 张量创建2.1 什么是张量2.2 基本创建方式2.3 线性和随机张量2.4 0、1、指定值张量2.5 指定元素类型张量 3 张量类型转换3.1 张量转换为NumPy数组3.2 NumPy数组转换为张量3.3 提取标量张量…...
vue2与vue3的区别
目录 1. 性能 2. 组合式 API 3. 生命周期钩子 4. 片段(Fragments) 5. 递归组件 6. 自定义渲染器 7. 全局 API 8. 组件内部的 this 9. 模板语法 10. 兼容性 总结 Vue 2 和 Vue 3 是 Vue.js 框架的两个主要版本,它们在多个方面有所不…...
八股学习 Mysql
八股学习 Mysql 常见面试问题优化其他 定位慢查询方案一:开源工具方案二:MySQL自带慢日志 SQL执行计划示例场景名词解释 索引概念底层数据结构聚簇索引、二级索引(非聚簇索引)覆盖索引覆盖索引应用场景创建原则索引失效 SQL优化表…...
主从复制
简述mysql 主从复制原理及其工作过程,配置一主两从并验证。 主从原理:MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。 主从同步的核心原理是将主服务器上的二…...
服务器数据恢复—Zfs文件系统数据恢复案例
服务器数据恢复环境&故障: 一台zfs文件系统的服务器,管理员误操作删除了服务器上的数据。 服务器数据恢复过程: 1、将故障服务器中所有硬盘做好标记后取出,硬件工程师检测后没有发现有硬盘存在硬件故障。以只读方式将所有硬盘…...
Linux安装docker,安装配置xrdp远程桌面
Linux安装docker,安装配置xrdp远程桌面。 1、卸载旧版本docker 卸载旧版本docker命令 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine现在就是没有旧版本的d…...
Windows11电脑总是一闪一闪的,黑一下亮一些怎么解决
Windows11电脑总是一闪一闪的,黑一下亮一些怎么解决 1. 打开设备管理器2. 点击显示适配器3. 更新下方两个选项的驱动3.1 更新驱动Inter(R) UHD Graphixs3.2 更新驱动NVIDIA GeForce RTX 4060 Laptop GPU 4. 其他文章快来试试吧🥰 1. 打开设备管理器 在电…...
Low-Level 大一统:如何使用Diffusion Models完成视频超分、去雨、去雾、降噪等所有Low-Level 任务?
Diffusion Models专栏文章汇总:入门与实战 前言:视频在传输过程中常常因为各种因素(如恶劣天气、噪声、压缩和传感器分辨率限制)而出现质量下降,这会严重影响计算机视觉任务(如目标检测和视频监控)的性能。现有的视频修复方法虽然取得了一些进展,但通常只能针对特定的退…...
使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发
开发一个完整的工作流系统使用 Blazor 和 Elsa Workflows 作为引擎,可以实现一个功能强大的工作流管理和设计系统。下面将提供详细的步骤和代码实现,展示如何在 Blazor 中开发一个基于 Elsa Workflows 的工作流系统。 项目概述 我们的工作流系统将包含以…...
调试Hadoop源代码
个人博客地址:调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数,如下: export HADOOP_NAMENODE_OPTS"-Xdeb…...
mkv转码mp4(ffmpeg工具)
基于windows,Linux也可以用,都是命令行 下载路径(https://github.com/BtbN/FFmpeg-Builds/releases) 下载安装包:ffmpeg-n6.1-latest-win64-lgpl-6.1.zip,(根据自己的平台选择下载)并…...
前端项目搭建和基础配置
这个模块主要是介绍从零开始搭建项目的一些操作,包含一些前端常用的配置,这里只是一部分,会在后续的文章中逐步进行补充和完善 一、创建项目 在项目路径下使用以下命令生成前后端项目 npm create vite输入项目名称,框架选择Vue…...
计算机网络 (49)网络安全问题概述
前言 计算机网络安全问题是一个复杂且多维的领域,它涉及到网络系统的硬件、软件以及数据的安全保护,确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施,保…...
【Qt】02-信号与槽函数
发生的原因与事件 前言一、什么是信号与槽(Signals and Slots)?1.1 信号(Signals)1.2 槽(Slots)1.3 连接方式 二、调用基本的信号与槽函数2.1 代码分析connect()的用法 2.2 结果展示 三、自定义…...
CVPR 2024 机器学习方向总汇(多任务、联邦学习、迁移学习和对抗等)
1、Machine Learning(机器学习)多任务、联邦学习、迁移学习和对抗等 Molecular Data Programming: Towards Molecule Pseudo-labeling with Systematic Weak Supervision 👍摘要Improving Physics-Augmented Continuum Neural Radiance Field-Based Geometry-Agnos…...
spring中bean的循环依赖细节描述
首先,循环依赖不是一件好事,设计上几乎不会这么设计。但是总有时候要碰到一起奇怪的循环依赖。 spring bean循环依赖之所以能实现,也是有条件的,构造函数的依赖显然不行。而bean生命周期的实例化和属性设置是分阶段的,…...
LeetCode - #187 Swift 实现重复的DNA序列
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
【gin】gin中使用protbuf消息传输go案例
在 Gin 中使用 Protobuf 进行高效消息传输 Protobuf(Protocol Buffers)是一种高效的二进制序列化协议,广泛用于高性能场景的数据传输。相比 JSON,Protobuf 具有更小的体积和更快的解析速度,非常适合服务间通信或前后端…...