当前位置: 首页 > news >正文

如何在个人web项目中使用会话技术(cookiesession)?

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
服务器软件:apache-tomcat-8.5.27


目录

  • 一. 什么是会话?
  • 二. 为什么要使用会话技术?
  • 三. 如何使用会话技术?
    • 3.1 Cookie(客户端的会话技术)
      • 3.1.1 如何将数据保存到cookie内?
      • 3.1.2 如何将数据从cookie中取出来?
      • 3.1.3 cookie数据的有效时间
      • 3.1.4 设置cookie的携带条件
      • 3.1.5 案例(登录页面:实现记住用户和密码)
    • 3.2 Session(服务器端的会话技术)
      • 3.2.1 什么是会话域?
      • 3.2.2 session有哪些方法?
      • 3.2.3 服务器如何区分客户端和session对象的对应关系?
      • 3.2.4 会话什么时候结束?
      • 3.2.5 session的应用场景
      • 3.2.6 getsession()方法的工作机制是怎样的?


一. 什么是会话?

翻开百度百科关于“会话”的词条,它是这样描述:“在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。”,诚然,也确是如此。

当客户端(终端用户)与服务器相互通信时,从客户端向服务器发出的一次请求开始,到服务器回应给客户端的一次响应结束,我们将其称为是一次交互。举个例子,比如当我们登录中国银行app上去查询银行卡的余额,当我们点击软件上的查询按钮,到app上显示余额数字时的一瞬间,就产生了一次交互。

而一次会话,则是由一次乃至n次交互共同构成。 比如当我们登录中国银行app到退出app的过程就是一个会话过程。


二. 为什么要使用会话技术?

目的:

为保持用户登录状态

什么意思?

当用户在登录之后,会在服务器中保存该用户的登录状态,当该用户后续访问该web项目中的其它动态资源经过(Servlet或者Thymeleaf)响应的时候,能够判断当前是否是已经登录过的。
这样哪怕用户手滑叉掉服务器的主页链接,而再次点击登录不必重复输入用户名与密码去登录。

好处:

  • 可以提高用户的使用体验和减少重复的操作
  • 有助于提供更为个性化的服务,让用户感受到更高效、便捷的使用体验。

三. 如何使用会话技术?

3.1 Cookie(客户端的会话技术)

简介:

Cookie是一种客户端的会话技术,它是服务器存放在浏览器(客户端)的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。

作用:

  1. 在浏览器中存放数据
  2. 将浏览器中存放的数据携带到服务器

3.1.1 如何将数据保存到cookie内?

步骤:

  1. 创建Cookie对象并设置数据

  2. 将cookie添加到响应报文

案例:演示创建cookie对象并添加至响应报文中

代码演示如下:

//1.创建Cookie对象并设置数据(ke与value的结构)
Cookie cookie01=new Cookie("adminKey","adminValue");
Cookie cookie02=new Cookie("rootKey","rootValue");
//2.将cookie添加到响应报文
response.addCookie(cookie01);
response.addCookie(cookie02);

在这里插入图片描述

cookie数据的特点:

  • 一旦cookie被保存到客户端,在以后的每次请求中都会带着所有的cookie

    注意:

    假设你此时用Google浏览器保存刚设的cookie,再开个浏览器连接服务器,发出请求,你无法获得存放在Google浏览器里的cookie

  • 此时添加cookie被称为瞬时cookie,一旦浏览器关闭,cookie就会消失(浏览器关闭,会话就结束)

    思考:为什么浏览器一关闭,这个cookie就会消失?

    它之所以被称为瞬时cookie,是因为它被存放在运行内存中。我们电脑上每个程序的开启,cpu都会为该程序分配一个进程,而进程则会得到一个独立的内存,而cookie则是存储到这个独立的运行内存中。故而浏览器的进程一结束,cookie自然也就消失了。

3.1.2 如何将数据从cookie中取出来?

案例:演示把刚才设的cookie值取出来

代码演示如下:

//从请求报文中获得cookie,返回cookie列表
Cookie[] cookies = request.getCookies();
//判断cookie列表中有无空值,避免空指针异常
if (cookies!=null){//遍历列表中的每一个cookiefor (Cookie cookie : cookies) {//获得cookie的key值System.out.println(cookie.getName());//获得cookie的value值System.out.println(cookie.getValue());}
}

3.1.3 cookie数据的有效时间

如果我们不设置Cookie的有效时间,默认情况下Cookie的有效期是一次会话范围内,我们可以通过cookie的 setMaxAge() 方法让Cookie持久化保存到浏览器上

  • 会话级Cookie(未设置有效时间)
    • 服务器端并没有明确指定Cookie的存在时间
    • 在浏览器端,Cookie数据存在于内存中
    • 只要浏览器还开着,Cookie数据就一直都在
    • 浏览器关闭,内存中的Cookie数据就会被释放
  • 持久化Cookie(设置了有效时间)
    • 服务器端明确设置了Cookie的存在时间
    • 在浏览器端,Cookie数据会被保存到硬盘上
    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
    • 持久化Cookie到达了预设的时间会被释放

cookie.setMaxAge(int expiry)参数单位是,表示cookie的持久化时间,如果设置参数为0,表示将浏览器中保存的该cookie删除

设置的位置:在添加到响应报文之前设置它的有效时间

代码示例如下:

//设置cookie的有效时间,在该时间段内,该cookie会存放在磁盘,时间一过,它会消失
cookie01.setMaxAge(60);//单位是秒

3.1.4 设置cookie的携带条件

释义:

希望在什么样的请求路径下去携带该cookie

举例:

如果我们希望在访问"http://localhost:8080/day11_ajax_war_exploded/root"下
携带某一个cookie并已设置好条件,在浏览器网址栏键入该请求路径,浏览器发出请求后,请求报文中会包含该cookie值传给服务器,服务器可以获取到该cookie。

设置的位置:在添加响应报文之前设置一个请求路径

代码示例如下:

//设置cookie01只有在访问当前项目下的user下的请求时才会携带
cookie01.setPath(request.getContextPath()+"/user");//设置一个uri

3.1.5 案例(登录页面:实现记住用户和密码)

案例需求:在登录页面上实现记住用户名和密码

代码示例如下:

①搭建Thymeleaf的环境

a. 导入Thymeleaf的相关jar包

在这里插入图片描述

b. 粘贴viewBaseServlet
c. 在web.xml中配置Thymeleaf前缀和后置

<!--thymeleaf的前缀和后缀-->
<context-param><param-name>view-prefix</param-name><param-value>/WEB-INF/pages/</param-value>
</context-param>
<context-param><param-name>view-suffix</param-name><param-value>.html</param-value>
</context-param>

②在index.html内引入访问登录界面的超链接,准备登录界面(login.html)与登录成功界面(login_success.html),并引入Thymeleaf渲染表达式

//准备登录界面(login.html)并引入Thymeleaf渲染表达式
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><base th:href="@{/}"><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="cookie?flag=login" method="post">用户名:<input type="text" name="username" th:value="${username}"><br>密码:<input type="password" name="password" th:value="${password}"><br><input type="checkbox" name="confirm"/>记住用户名和密码<br><input type="submit" value="登录"></form>
</body>
</html>
//准备登录成功界面(login_success.html)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>

③在cookieServlet内编写相关代码实现功能

实现功能思路:

在登录界面上用户输入用户名与密码后,点击登录,浏览器发出请求,CookieServlet接收请求,调用login()方法,判定用户名与密码正确且用户已勾选“记住用户名与密码”时,它会从请求报文中获取请求参数username与password赋给两个cookie对象,将这两个cookie对象存放到响应报文中,目的是在响应给浏览器时让浏览器存储这两个cookie。然后在首页访问“登录”界面时,请求给CookieServlet,CookieServlet调用tologin()f方法,把请求报文中的cookie拿出来,存放在请求域内,最后用thymeleaf渲染登录界面,渲染的时候会把两个cookie从请求域拿出来替换进login.html中表单里的用户名与密码的thymeleaf渲染表达式【th:value=“${password}”】中,生成一个view对象响应给浏览器

//转发至login.html
protected void tologin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username="";String password="";Cookie[] cookies = request.getCookies();if (cookies!=null){for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())){username=cookie.getValue();}else if ("password".equals(cookie.getName())){password=cookie.getValue();}}}request.setAttribute("username",username);request.setAttribute("password",password);this.processTemplate("login",request,response);
}//登录功能实现
protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");String confirm = request.getParameter("confirm");if ("admin".equals(username) && "123456".equals(password)){if (confirm!=null){//设置cookieCookie usernameCookie=new Cookie("username",username);Cookie passworCookie=new Cookie("password",password);//设置cookie的有效时间/*usernameCookie.setMaxAge(60*3);passworCookie.setMaxAge(60*3);*///在响应报文中添加cookieresponse.addCookie(usernameCookie);response.addCookie(passworCookie);}//登录成功跳转至login_success.htmlSystem.out.println(username+"登录成功");this.processTemplate("login_success",request,response);}else {//登录失败停留在当前页面(login.html)System.out.println("用户名或密码错误");this.processTemplate("login",request,response);}}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2 Session(服务器端的会话技术)

简介:

session是服务器端的技术,数据存放在服务器端。 服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中

注意:

  • 服务器会为每一个客户端创建一个Session对象,该客户端每次访问如果需要session对象,就返回之前创建的
  • 服务器端的会话从第一次获得Httpsession对象开始的,至到Httpsession对象销毁结束

3.2.1 什么是会话域?

在 Web 应用中,会话域(Session Scope)是指一个会话周期内可见的范围。它通常用于存储在整个会话期间需要跨多个请求共享和访问的数据。

它与请求域,应用域之间的关系:

在 Java Web 开发中,会话域(Session Scope)、 请求域(Request Scope)和 应用域(Application Scope)都是指在不同范围内可见的数据存储方式。它们之间有以下关系:

  1. 会话域一个会话对应一个 HttpSession 对象,生命周期与会话保持一致。会话域中存储的数据在整个会话期间均可访问,包括多次请求过程中涉及到的数据。 可以使用 HttpSession对象提供的方法向会话中添加、获取或删除数据。
  2. 请求域一个请求对应一个 HttpServletRequest 对象,请求域中存储的数据只在当前请求中有效。 通过HttpServletRequest 对象提供的 setAttribute() ,getAttribute()等方法可以往请求域中添加和获取数据。
  3. 应用域一个应用对应一个 ServletContext 对象,应用域中存储的数据在整个应用程序运行过程中均可访问。 可以使用ServletContext 对象提供的方法向应用域中添加、获取或删除数据。

综上:它们之间的区别主要在于存储数据的范围和生命周期。会话域适合存储需要跨多个请求共享和访问的数据,在整个会话周期中保存;请求域适合存储只在当前请求中有效的数据;应用域适合存储全局通用的数据,在整个应用程序运行期间都可以访问。

它们之间的关系是一个包含关系,也就是应用域是所有范围的顶层容器,会话域是请求域的顶层容器,而请求域则包含了自身作用域以及转发或者包含的子请求所绑定的请求域数据。在进行数据存储和访问时,需要根据实际使用场景灵活选择合适的作用域,并使用相应的 API 进行操作。

3.2.2 session有哪些方法?

①得到Httpsession对象

注意:获得session(如果第一次调用的时候其实是创建session,第一次之后通过sessionId找到session进行使用)

代码示例如下:

request.getsession();

②设置共享数据

代码示例如下:

//在会话域内设置共享数据(key为sessionMsg,value为sessionvalue),根据key找到对应的value
session.setAttribute("sessionMsg","sessionvalue");

③获得共享数据

代码示例如下:

//在会话域内根据key为sessionMsg找对应的共享数据
object sessionMsg=session.getAttribute("sessionMsg");

④移除共享数据

代码示例如下:

//从请求域内删除key为sessionMsg的共享数据
session.removeAttribute("sessionMsg");

案例:在index.html中创建“得到Httpsession对象”,“设置共享数据”,“获得共享数据”,“移除共享数据”等四个方法的超链接以访问SessionServlet,依次调用其中创建的方法,开启两个浏览器点击上述四个超链接观察演示效果

代码演示如下:

①创建SessionServlet并在web.xml中配置其访问路径 /session

//创建SessionServlet并在web.xml中配置其访问路径 /session
<servlet><servlet-name>SessionServlet</servlet-name><servlet-class>Servlet.module.SessionServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>SessionServlet</servlet-name><url-pattern>/session</url-pattern>
</servlet-mapping>

②在index.html中创建四个方法的超链接以访问SessionServlet

//在index.html中创建四个方法的超链接以访问SessionServlet
<a href="session?flag=getsession">获得session对象</a><br>
<a href="session?flag=setValuesession">在session会话域内设置共享数据</a><br>
<a href="session?flag=getValuesession">在session会话域内获得之前设置的共享数据</a><br>
<a href="session?flag=removeValuesession">在session会话域内删除之前设置的共享数据</a><br>

③SessionServlet实现其四个方法

//SessionServlet实现其四个方法
import Servlet.base.BaseServlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class SessionServlet extends BaseServlet {protected void getsession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得session对象,从这开启会话HttpSession session = request.getSession();System.out.println("session = "+session);}protected void setValuesession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得并打印session对象,HttpSession session = request.getSession();System.out.println("session = "+session);//在会话域设置共享数据(key与value)【sessionKey=sessionValue】session.setAttribute("sessionKey","sessionValue");}protected void getValuesession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得并打印session对象,HttpSession session = request.getSession();System.out.println("session = "+session);//获取在会话域设置的共享数据(key与value)Object sessionKey = session.getAttribute("sessionKey");//【sessionValue】System.out.println("sessionKey = "+sessionKey);}protected void removeValuesession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得并打印session对象,HttpSession session = request.getSession();System.out.println("session = "+session);//删除在会话域设置的共享数据(key与value)【sessionValue】session.removeAttribute("sessionKey");Object sessionKey = session.getAttribute("sessionKey");System.out.println("sessionKey = "+sessionKey);}
}

在这里插入图片描述

在这里插入图片描述

3.2.3 服务器如何区分客户端和session对象的对应关系?

why?

是通过cookie实现区分的!session依赖于cookie。

实现原理:

①当客户端第一次访问服务器,调用getsession(),新建一个session对象,并且设置一个cookie给浏览器(jsessionid)

在这里插入图片描述

②当客户端第二次访间服务器,调用getsession(),就去获得请求中的jsessionid这个cookie,通过cookie的value值找到session对象

在这里插入图片描述

3.2.4 会话什么时候结束?

①客户端关闭(jsessionid这个cookie消失)

②强制失效

代码示例如下:

session.invalidate();//强制失效

③自动失效(达到最大空闲时间)

默认半小时 (无操作,没有往服务器发送过请求),从无操作之前的最后一次请求开始计算最大空闲时间

代码示例如下:

session.setMaxInactiveInterval(30);//单位是秒

3.2.5 session的应用场景

①通常是用于在 Web 应用程序中存储特定用户相关信息的,如

登录界面:保持用户的登录状态,注销

实现思路:

在servlet里登录的方法中将根据业务层查询返回的bean对象放在会话域内,利用会话域内bean对象的存亡来保持登录状态

②还可以存储各种用户相关的数据,例如用户 ID、用户名、角色、购物车等等。这些数据可以通过服务器端代码来设置、获取和删除。 使用 Session,可以实现以下功能:

1.用户认证和授权:使用 Session 来存储用户登录时输入的用户名和密码、对应的权限等信息,确保只有经过身份验证的用户才能访问应用程序中的受保护资源。

2.数据持久化:Session 可以使用 Cookie 或者 URL Rewriting 技术将数据保存在客户端,也可以在服务器端内存或文件中保存,从而实现数据持久化。

3.业务逻辑处理:根据当前 Session 中保存的信息,可以在后台执行逻辑操作,如购物车计算等。

3.2.6 getsession()方法的工作机制是怎样的?

前提:

浏览器正常访问服务器

工作机制:

1.调用getsession()创建session对象,判断请求中是否存在JSESSIONID这个cookie

判断存在根据JSESSIONID对应的cookie值去,然后在服务器中寻找对应的session对象

a.如果找到了session对象直接返回该session对象即可

b.找不到session对象新建一个session对象,并且设置JSESSIONID这个cookie

判断不存在新建一个session对象,并且设置JSESSIONID这个cookie

在这里插入图片描述


相关文章:

如何在个人web项目中使用会话技术(cookiesession)?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 服务器软件&#xff1a;apache-tomcat-8.5.27 目录 一. 什么是会话&#xff1f;二. 为什么要使用会话技术&#xff1f;三. 如何使用会话技术&#xff1f;3.1 Cookie(客户端的会话技术…...

创建线索二叉树

创建线索二叉树 一、创建线索二叉树一、案例1、前序线索二叉树2、中序线索二叉树3、后序线索二叉树 一、创建线索二叉树 现将某结点的空指针域指向该结点的前驱后继&#xff0c;定义规则如下&#xff1a; 若结点的左子树为空&#xff0c;则该结点的左孩子指针指向其前驱结点。…...

HNU-操作系统OS-实验Lab2

OS_Lab2_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf &#xff08;学号 202108010XXX&#xff09; 前言 实验一过后大家做出来了一个可以启动的系统&#xff0c;实验二主要涉及操作系统的物理内存管理。操作系统为了使用内存&#xff0c;还需高效地管理…...

如何使用HTML和CSS创建有方向感知的按钮

在互联网应用中&#xff0c;按钮是一种常见的控件&#xff0c;用户通过点击按钮来触发相应的操作。考虑到用户体验和交互设计&#xff0c;设计有方向感知的按钮可以使得用户更加易于理解按钮的功能和状态。 在本文中&#xff0c;我们将介绍如何使用HTML和CSS来创建具有方向感知…...

java 线程安全

内部锁 在 Java 中&#xff0c;每个对象都有一个内部锁&#xff0c;也称为监视器锁或对象锁。内部锁是通过在代码块或方法前加上 synchronized 关键字来实现的。当一个线程执行一个带有 synchronized 关键字的方法或代码块时&#xff0c;它必须先获得该对象的内部锁&#xff0…...

移动硬盘修复后文件丢失恢复方法

最近收到很多这样的咨询&#xff1a; 问1&#xff1a;移动硬盘目录损坏用chkdsk修复后&#xff0c;文件被删除&#xff0c;怎么才可以恢復文件&#xff1f; 问2&#xff1a;移动硬盘出错然后修复&#xff0c;然后文件都没有了怎么处理啊&#xff01;&#xff01;&#xff01;&a…...

直线飙升到10万+star的AutoGpt,有多强?帮我写了个网页!

先来感受一下10万的star&#xff0c;到底有多强&#xff01; 从4月2日开始&#xff0c;直线飙升到10万star Auto-GPT是一个实验性的开源应用程序&#xff0c;展示了GPT-4语言模型的功能。这个程序由GPT-4驱动&#xff0c;将LLM“思想”链接在一起&#xff0c;以自主实现您设定的…...

rk3568平台调试typec口实现uvc输出,网络共享等功能

一、修改kernel相关配置 注意&#xff1a;一定要知道主控接线&#xff0c;那个物理口是otg的&#xff0c;然后要找准与之所连接的phy和控制器。然后处理CC1 CC2识别芯片&#xff0c;fusb302。默认sdk自带有驱动&#xff0c;需要配上中断脚和提供VBUS 5V的脚。用来判断角色是DF…...

java基础知识——26.反射

这篇文章我们来讲一下java的代理与反射&#xff0c;这是很重要的一部分内容。 目录 1.什么是反射 2.获取class对象的三种方式 3.反射获取构造方法 4.利用反射来获取成员变量 5.利用反射来获取成员方法 6.反射的作用 7.反射小结 1.什么是反射 首先&#xff0c;我们来看…...

【容器化】Docker 简介和安装

【容器化】Docker 简介和安装 DockerDocker的应用场景Docker 的优点1、快速&#xff0c;一致地交付您的应用程序2、响应式部署和扩展3、在同一硬件上运行更多工作负载 Docker 架构Docker 安装Ubuntu Docker 、Debian Docker 安装使用官方安装脚本自动安装手动安装使用 Shell 脚…...

性能测试场景分析并设计?超细案例讲解,看这篇就够了

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试场景&…...

JAVA9新特性

JAVA9新特性 概述 ​ 经过4次推迟&#xff0c;历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统&#xff0c;在最初设想的时候并没有想过那么复杂&#xff0c;花费的时间超出预估时间。距离java8大约三年时间。 ​ Java 9提供了超过150项新功能特性&#x…...

( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】

❓645. 错误的集合 难度&#xff1a;简单 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了…...

2023年全国最新道路运输从业人员精选真题及答案63

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 119.在危险货物道路运输过程中&#xff0c;&#xff08;&#x…...

Kettle安装与使用

一、Kettle简介 Kettle最早是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff09;工具&#xff0c;全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。它由Java开发&#xff0c;…...

C51 - DS18B20

Thermometer 1> 实验概述2> 硬件设计3> DS18B203.1> 原理框图3.2> 数据格式 4> 单总线&#xff08;1-Wire&#xff09;通讯协议4.1> 初始化&#xff08;复位&#xff09;时序4.2> 写-DS18B20时序4.3> 读-DS18B20时序4.4> 命令 5> 程序设计5.1…...

手把手教你使用vue2搭建微前端micro-app

​ 简述 本文主要讲述新手小白怎么搭建micro-app&#xff0c;几乎是每一步都有截图说明。上手应该很简单。 研究背景 这段时间在网上找了很多有关微前端相关的知识&#xff0c;起初本来是想着先搭建一个single-spa&#xff0c;但是奈何网上能找到的内容都是千篇一律。我也是…...

DDR3(MIG核配置官方demoFPGA代码实现及仿真)

由于直接对 DDR3 进行控制很复杂&#xff0c;因此一般使用 MIG IP 来实现&#xff0c;同时为了更简单地使用 MIG IP&#xff0c;我们采用 AXI4 总线协议进行控制。下面首先介绍 MIG IP 的配置&#xff0c;然后看看官方 demo &#xff08;里面包含一个仿真要用到的 DDR3 模型&am…...

传奇人物《周兴和》书连载之67 不辱神圣的使命

不辱神圣的使命 这里&#xff0c;先前还是一个十分神秘的地方。 外人和车辆要想进入这片区域&#xff0c;那是绝对不允许的。这片区域隐于群山之中&#xff0c;且戒备森严&#xff0c;外人若想进入&#xff0c;那是要经过好几道政治审查和随身检查的。近年来&#xff0c;随着…...

Spring框架中的单例Beans是线程安全的么?

在Spring框架中&#xff0c;单例Beans默认是线程安全的。 当你在Spring框架中声明一个单例Bean并配置为默认的单例作用域时&#xff0c;Spring会确保对该Bean的并发访问是线程安全的。以下是一个简单的代码演示&#xff1a; 假设我们有一个名为 SingletonBean 的单例 Bean 类…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...

【threejs】每天一个小案例讲解:创建基本的3D场景

代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone&#xff0c;无需安装依赖&#xff0c;直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景&#xff08;Scene&#xff09; 使用 THREE.Scene(…...

Qt学习及使用_第1部分_认识Qt---Qt开发基本流程

前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…...

Unity-ECS详解

今天我们来了解Unity最先进的技术——ECS架构&#xff08;EntityComponentSystem&#xff09;。 Unity官方下有源码&#xff0c;我们下载源码后来学习。 ECS 与OOP&#xff08;Object-Oriented Programming&#xff09;对应&#xff0c;ECS是一种完全不同的编程范式与数据架构…...