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

news2024/9/23 19:29:00

编译软件: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){
    //遍历列表中的每一个cookie
    for (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){
            //设置cookie
            Cookie usernameCookie=new Cookie("username",username);
            Cookie passworCookie=new Cookie("password",password);

            //设置cookie的有效时间
            /*usernameCookie.setMaxAge(60*3);
            passworCookie.setMaxAge(60*3);*/

            //在响应报文中添加cookie
            response.addCookie(usernameCookie);
            response.addCookie(passworCookie);
        }
        //登录成功跳转至login_success.html
        System.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

在这里插入图片描述


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

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

相关文章

springboot+vue 个人健康信息管理系统

系统分为用户和医师&#xff0c;管理员三个角色 管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.用户管理&#xff1a;对注册的用户信息进行添加&#xff0c;删除&#xff0c;修改&#xff0c;查询 4.医师管理&am…

seo文章批量更新-SEO文章自动批量生成

使用SEO文章生成器&#xff0c;让您的网站排名更靠前&#xff01; 您是否对搜索引擎排名感到困扰&#xff1f;难道您想要网站排名更好&#xff0c;但却没有足够的时间和资源进行SEO优化吗&#xff1f;那么您需要尝试使用SEO文章生成器来帮助您的网站获得更好的排名&#xff01…

数据结构(二)—— 链表

文章目录 一、链表基础1.1 链表定义1.2 创建链表1.3 删除链表某一节点1.4 与数组的对比二、题2.1 203 移除链表元素2.2 707 设计链表2.3 206 反转单链表2.4 24 两两交换链表中的节点2.5 9 删除链表的倒数第N个节点2.6 面试题 02.07. leetcode160 链表相交2.7 142 环形链表II2.7…

Verilog带参数的`define用法

宏除了可以进行简单的文本替换,还可以像函数和任务一样传递指定多个参数分别对文本进行对应的替换. 示例1&#xff1a; define Disp(pa,pb,pc) \initial \begin \#1200; \$display("%d \n",(papbpc)); \$display(" data_ pa data_ pb data_ pc %d",(…

微信小程序 基于Promise 对 wx.request 封装处理

导语&#xff1a; 当我们进行微信小程序开发的时候&#xff0c;会经常涉及到发送网络请求来进行后台数据交互&#xff0c;而在微信小程序中&#xff0c;用来 发送请求的方法是 wx.request() , 但是由于 wx.request() 方法 不支持 Promise 风格的调用&#xff0c;所以导致 wx.re…

【C++从0到王者】第一站:从C到C++

目录 一、命名空间 1.C的命名缺陷 2.域和命名空间 3.命名空间的使用与嵌套 二、输入输出 三、缺省参数&#xff08;默认参数&#xff09; 1.缺省参数的概念 2.缺省参数分类 1>全缺省参数 2>半缺省参数 3.缺省参数的一些使用场景 4.缺省参数在分文件使用的注意…

系统运维(Docker篇)

前言 打怪升级之路&#xff0c;从未停息 ​ 在这个社会信息技术的发展速度越来越快&#xff0c;这种快速发展带来了激烈的竞争。在这个竞争性的环境中&#xff0c;只有不断学习和更新自己的技能&#xff0c;才能保持竞争力。其次随着云计算、容器化、自动化等技术的出现&…

Qt Quick - 容器控件综述

Qt Quick - 容器控件综述 一、概述二、ApplicationWindow Control三、Frame Control四、GroupBox Control五、Page Control六、Pane Control七、ScrollView Control八、StackView Control九、SwipeView Control十、TabBarControl十一、ToolBar控件 一、概述 Qt Quick Controls…

Linux基础——FTP原理与配置

Linux基础——FTP原理与配置 一、文件传输协议——FTP服务二、ftp配置文件解析三、FTP服务器搭建 一、文件传输协议——FTP服务 FTP是典型的C/S结构的应用层协议&#xff0c;需要由服务器软件、客户端软件两个部分共同实现文件传输功能 FTP 连接模式 FTP服务器默认使用TCP协议…

设计师找灵感,就上这5个网站~

分享5个设计灵感网站&#xff0c;多看看设计大佬的优秀作品&#xff0c;对提升审美、灵感都有很大的帮助&#xff0c;还可以结合好的设计运用到自己的作品当中&#xff0c;话不多说&#xff0c;上干货~ &#xff08;PS&#xff1a;部分网站需要科学上网才能访问~&#xff09; …

celery简单入门

celery B站连接&#xff1a;https://www.bilibili.com/video/BV1jg4y13718?p7&spm_id_frompageDriver&vd_source1717654b9cbbc6a773c2092070686a95 创建项目celery_project 一、新建一个celery_task.py文件 二、新建一个produce_task.py文件 三、新建一个result.py…

Linux 机器间配置 SSH 免密登录

在日常工作中&#xff0c;服务器常常会有多台。特别是应用服务器存在多台的情况下&#xff0c;在每台机器手动部署或升级服务&#xff0c;每次登录多台机器特别麻烦&#xff0c;通过一台机器跳转每次输入密码&#xff08;一般都是超强密码&#xff09;也麻烦。所以说配置机器间…

如何智能改写文案内容-如何用ai改字

伪原创在线文章生成器 在当今数字时代&#xff0c;营销推广已成为各行各业的必备工具&#xff0c;其中之一便是内容营销。作为内容营销的一部分&#xff0c;文章撰写是非常关键的环节。为了满足市场需求&#xff0c;越来越多的在线文章生成器涌现出来&#xff0c;其中最受欢迎…

最强的ChatGPT竞品来了!免费好用,不需要兔魔法,小白都能用的GPT!

ChatGPT的功能非常强大&#xff0c;尤其是4.0&#xff0c;但是门槛很高&#xff0c;月租需要20美金&#xff0c;适合专业选手&#xff01;其实很多人都是小白&#xff0c;完全不懂GPT&#xff0c;也不知道怎么用&#xff0c;只知道这个神器非常强大&#xff0c;于是走了很多很多…

chatgpt智能提效职场办公-ppt怎么插音乐上去

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 在 PowerPoint 中插入音乐&#xff0c;可以按照以下步骤操作&#xff1a; 找到要插入音乐的幻灯片&#xff0c;点击“插入”选项卡在选…

020:Mapbox GL加载高德地图(影像瓦片图)

第020个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载高德地图(影像瓦片图)。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共80行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:…

DelphiMVCFrameWork 源码分析(一)

Delphi 基础Web Service Application 见&#xff1a; Delphi Web Server 流程分析_看那山瞧那水的博客-CSDN博客 DataSnap的见&#xff1a; Delphi DataSnap 流程分析(一)_看那山瞧那水的博客-CSDN博客 Delphi DataSnap 流程分析(二)_看那山瞧那水的博客-CSDN博客 DelphiMVC…

Java每日一练(20230422)

目录 1. 拼接最大数 &#x1f31f;&#x1f31f;&#x1f31f; 2. Z 字形变换 &#x1f31f;&#x1f31f; 3. 跳跃游戏 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java…

su命令无权限,如何解决

正常情况下输入su命令执行如下 当遇到这种情况时别慌&#xff0c;很大概率是你还没连接Linux服务器。 在连接成功后&#xff0c;再尝试使用su命令成功的话&#xff0c;就会让你输入其他用户的密码。因为我只有一个普通用户和一个根目录&#xff0c;默认情况下是直接切换根用户。…

华为云企业快成长技术创新论坛全国巡演北京首站圆满落幕

4月15日&#xff0c;华为云联合msup举办的“企业快成长大数据技术创新论坛北京站”圆满举办&#xff0c;100余位来自全国各地的大数据技术总监/技术经理/研发工程师共聚一堂&#xff0c;共探数据湖的架构演进&#xff0c;数据治理方法论及最佳经验实践。 首先由华为云大数据人工…