Cookie Session

news2024/11/28 14:13:19

第一章 会话技术 

1.1 什么是会话

web会话可简单理解为:用户开一个浏览器,访问某一个web网站,在这个网站点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.

它是指浏览器和服务器之间的多次请求和响应:
也就是说,从浏览器访问服务器开始,可以多次访问服务器资源,到浏览器关闭为止这段时间
产生的多次请求和响应,合起来就叫做浏览器和服务器之间的一次会话。

例如:

1. 打开浏览器
2. 访问京东, 此时 与京东网站 产生了会话
3. 访问京东的具体商品页面; 或 其他页面; 或访问了其他网站, 此时,一直会与京东网站保持着会话连接
4. 关闭浏览器, 此时 与京东网站的会话结束;

重写打开浏览器,再次访问京东, 这就是第二次会话了

1.2 为什么要使用会话技术?

会话技术用来解决的客户端与服务器之间的通信问题,通过会话技术可以让每个用户的数据以会话对象的形式存储,方便以后访问web资源的时候使用。    
举几个场景:
    场景一:
        A和B两个人在某购物网站登录账号后,A购物车添加了一个TinkPad键盘,
       而B添加一本《JAVAWEB开发内幕》,这些商品信息都会被记录下来,
       以便用户在结账的时候可以买到对应的商品。
    场景二:
       在论坛登陆的时候,很多时候会有⼀个⼩框框问你是否要⾃动登陆,当你下次登陆的时候就不⽤输⼊密码了。
   场景三:
        根据我以前浏览过的商品,猜我喜欢什么商品

1.3 保存会话技术有哪些

在当下的市场开发中,传统项目的会话管理分为两类,分别是:客户端会话管理技术和服务端会话管理技术。
什么是客户端会话管理技术?
   程序把每个用户的数据以某种形式写给用户各自的浏览器。当用户使用浏览器再访问服务器中的web资源时,
   就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。我们采用Cookie技术实现。
什么是服务端会话管理技术?
    用户使用浏览器访问服务器的时候,服务把用户的信息,以某种形式记录在服务器上,
   这样在访问的时候就能保证用户各自使用各自在服务器中的数据。我们采用Session技术实现。

1.4 Java Web开发中使用的会话技术

在客户端与服务器端交互的过程中,通常会产生一些数据, 为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。
   
通过京东购物车案例, 了解会话技术 Cookie对象 和 Session对象
    Cookie对象:
        客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,
       解决会话从什么时候开始,到什么时候结束。
    Session对象:
        服务器端的会话技术,  它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session域中,
        实现该用户在本次会话中, 可随时获取Session域中的数据, 满足多次请求响应之间进行数据传递\访问使用.

第二章 Cookie技术

2.1 Cookie介绍

1.Cookie是什么?
    它是客户端浏览器的缓存文件,里面记录了客户浏览器访问网站的一些内容。
    同时,也是HTTP协议请求和响应消息头的一部分(在HTTP协议课程中,我们提到过它)。
2.为什么需要会话技术记录这些内容呢?
   我们网页的交互是通过HTTP协议,而HTTP协议是无状态的协议(数据提交后,浏览器和服务器连接就会关闭,再次交    互就得重新建立新的连接)。所以服务器是无法确认用户的信息,于是就给每个用户发一个通行证(Cookie),从而可    以通过此确认用户信息。
3.Cookie技术可以解决什么问题呢?
   可以用来在浏览器存储交互数据,当下次访问服务器的时候会自动带着相应cookie给服务器,
   从以此提高交互的效率!
4.谁来创建Cookie?它又保存在哪里?
   Cookie是由服务器创建,然后发送给客户端浏览器,
   最终可以保存到浏览器指定位置(前提浏览器支持)上的一段文本信息。

2.2 Cookie的工作流程

流程:
    1.第一次访问服务器,正常访问服务器.
    2.服务器接收到请求后,服务器端可以通过 set-cookie 响应头 响应一小段信息
    3.客户端(浏览器)接收到,自动保存cookie信息到cookie存储区中(由浏览器软件保存该信息)
    4.后续访问中,浏览器会从cookie存储区取出信息,并且在发送信息的时候,通过 cookie 请求头携带上
        服务器端接收到请求后,可以从请求头中获取该小段cookie信息.
强调:
    1.cookie就是一小段标识信息(键值对)!!!  
    2.cookie的内容保存在浏览器端!!!

2.3 Cookie的API介绍

服务器端创建Cookie对象

方法返回值描述
public Cookie(String name, String value)构造方法创建Cookie对象创建Cookie对象, 并指定Cookie中保存 的键值对信息

服务器端Response对象向浏览器发送Cookie

方法返回值描述
addCookie(Cookie c)void把方法参数指定Cookie对象c响应给客户端浏览器

服务器端Request对象获取浏览器发送的Cookie

方法返回值描述
getCookies()Cookie[]获取客户端发送的所有对象的数组,如果客户端浏览器没有发送Cookie返回null

Cookie对象的方法

方法参数描述
String getName()获取cookie 的名称(键)。名称在创建之后不得更改。
String getValue()获取cookie 的值
void setMaxAge(int s)int浏览器中Cookie是有生存时间的,默认是当前会话. 浏览器关闭,会话结束 该方法用于指定 cookie 的最大生存时间(以秒为单位)的整数; 如果为负数,则表示不存储该 cookie;如果为 0,则删除该 cookie
void setPath(String p)String设置携带Cookie的路径 也就是说浏览器访问什么样的路径才会携带Cookie对象
void setDomain(String d)String设置携带Cookie的域名(如:www.itheima.com) 也就是说浏览器访问什么样的域名才会携带Cookie对象

2.4 Cookie的代码演示

响应Cookie对象给浏览器

package com.itheima.cookie;
​
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;
/*
构建cookie的servlet
 */
@WebServlet("/create")
public class CreateCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("当浏览器访问到这个servlet的时候,我们就在这里构建一个cookie");
        //如何构建cookie
        Cookie cookie = new Cookie("username", "jack");
        Cookie cookie1 = new Cookie("job", "小钻风");
        System.out.println("构建出来之后 放到响应头中  就返回给了浏览器  完成了cookie的创建及保存");
        response.addCookie(cookie);
        response.addCookie(cookie1);
​
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("cookie已经创建好,你自己个在浏览器找吧!!");
    }
}

ps:第一发起请求,浏览器请求中不带cookie,响应的时候 服务传递两个cookie在响应头中。浏览器中看到了cookie

 获取客户端浏览器携带的Cookie数据

/*
	浏览器访问服务器,以请求头的方式携带Cookie(可能是多个)
    HttpServletRequest对象提供方法
    public Cookie[] getCookies(): 获取浏览器携带的所有Cookie对象,如果没有携带Cookie返回null
*/
@WebServlet(urlPatterns = "/get")
public class GetCookieServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        										throws ServletException, IOException {
        /**
         *  获取客户端浏览器携带的Cookie数据
         *  request对象方法 getCookies()
         */
        Cookie[] cookies =  request.getCookies();
        for (Cookie cookie : cookies){
            //遍历数组,取出的是数组中的每个Cookie对象
            //取出Cookie中的键
            String key = cookie.getName();
            //取出Cookie中的值
            String value = cookie.getValue();
            System.out.println(key+"==="+value);
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 													throws ServletException, IOException {
        doGet(request, response);
    }
}

ps:再次访问的时候浏览器会带着cookie过去,这次服务器没有构建cookie所以响应中没有cookie,但是请求中有cookie.服务器可以解析出来两个cookie

设置生存时间

默认

/*
	Cookie的生命周期
    	1.默认情况下: 一次会话有效,关闭浏览器,会话结束Cookie消失
        2.设置Cookie的生命周期(存活时间)
        	Cookie中提供方法
            public void setMaxAge(int s): 设置方法参数指定的s秒的生存时间
            	int s: 单位是秒
*/
@WebServlet(urlPatterns = "/life")
public class LifeCookieServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        										throws ServletException, IOException {
        Cookie cookie = new Cookie("heima","java");
        cookie.setPath(request.getContextPath());
        //设置生存时间
        cookie.setMaxAge(60);
        response.addCookie(cookie);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 													throws ServletException, IOException {
        doGet(request, response);
    }
}

设置Cookie的携带路径

默认路径是 创建该cookie上一级路径。
只有跟这个cookie相同路径的servlet才能传递过来到。保证模块独立性。
这个cookie在整个项目中公用,设置为项目路径。    

在Web开发中,Cookie是一种存储在客户端浏览器中的小数据片段,用于跟踪用户会话和存储用户偏好设置等信息。每个Cookie都有一个可选的Path属性,用于指定Cookie的作用域(即哪些Web页面可以访问该Cookie)。

Path属性是一个字符串,指定了Cookie的有效路径。默认情况下,如果未指定Path属性,则Cookie的有效路径为设置Cookie的页面路径。例如,如果在根目录下的index.html页面中设置了一个Cookie,则该Cookie的有效路径为"/",即整个网站可以访问该Cookie。如果在子目录下的页面中设置了一个Cookie,则该Cookie的有效路径为该子目录。

可以使用setPath()方法来设置Cookie的Path属性。例如,以下代码将创建一个名为"username"的Cookie,并将其Path属性设置为"/myapp":

Cookie cookie = new Cookie("username", "john");
cookie.setPath("/myapp");
response.addCookie(cookie);

在这种情况下,只有路径为"/myapp"或其子路径的页面才能访问该Cookie。如果在其他路径下的页面中尝试访问该Cookie,则无法访问。使用Path属性可以限制Cookie的作用域,从而增强Web应用程序的安全性和隐私性。

以上代码演示时,均需要打开浏览器调试模式,查看Cookie是否被创建,访问时是否携带了Cookie对象

第三章 Session技术

3.1 Session介绍

1.为什么要使用Cookie和Session?
    ⽤户使⽤浏览器访问服务器的时候,服务器把可以为每个用户浏览器创建一个会话对象(session对象),
    因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器所属的session中,
   当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据
   实现用户数据在会话中的共享。
2.什么是Session?
    Session对象: 服务器端的会话技术,  它可以把同一用户与服务器多次请求响应的一些数据
    记录在服务器Session域中, 实现该用户在本次会话中, 可随时获取Session域中的数据,
    满足多次请求响应之间 进行数据传递\访问使用.

思考, 下面的购物车案例中, 使用ServletContext域 或 Request域 存储购物车商品信息 是否适合?

 1.Session与Cookie是紧密相关的。 
    Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,
    或者设置为禁用Cookie,那么将不能使用Session。

2.Session信息对客户来说,不同的用户, 使用不同的Session信息来记录。
    当用户启用Session时,Tomcat引擎自动产生一个SessionID. 在新会话开始时,
    服务器将SessionID当做cookie存储在用户的浏览器中。

3.2 session与cookie的区别

1:Cookie是把用户的数据写给用户的浏览器。Session技术把用户的数据写到用户所属的session中。
2:Session⽐Cookie使⽤⽅便,Session可以解决Cookie解决不了的事情
   【Session可以存储对象,Cookie只能存储字符串。】
3:Cookie存储在浏览器中,对客户端是可⻅的。信息容易泄露出去。
   Session存储在服务器上,客户端是无法获取的。不存在敏感信息泄露问题。

cookiesession
会话数据保存的位置浏览器服务器
数据的安全性不安全安全
存储数是否有限制

3.3 session的工作流程

session的工作流程总结:
    1.请求服务器,请求服务器端储存信息
    2.服务器端接收请求,创建一个session对象和一个唯一id 一一映射放在session池中
    3.将数据存储到session对象中 (session对象内部是map集合可以储存很多信息)
    4.响应给客户端的时候,在响应头中带有一个jessionId的cookie 值是该session的唯一ID
    5.客户端在之后的请求中,都自动携带该cookie,服务器端根据该cookie中唯一id,获取与之对应的session对象
        
综上所述:
    1.session是一个域对象,只要在一个会话中就可以实现多个Servlet间数据共享。
    2.每一个客户端都有自己唯一对应的session对象,故存放的数据也是私有的.别的客户端无法获取。
    3:jsessionId 这个Cookie存活时间为会话结束,也就是关闭浏览器就没有了。  

3.4 Session的API介绍

获取通过Request对象调用如下方法获取Session域对象

HttpSession接口,session对象是接口的实现类,实现类对象tomcat引擎创建
方法 request.getSession()获取session对象
作用域 : 一次会话有效,浏览器不关闭
方法返回值描述
getSession()HttpSession获取当前会话对应的Session对象,如果没有,则创建一个Session对象。

Session域对象存储数据

方法返回值描述
setAttribute(String name, Object obj)void向Session域中保存数据
getAttribute(String name)Object从Session域中获取数据
removeAttribute(String name)void从Session域中移除数据

Session域对象销毁

1.如果我们打开一个页面长时间不访问,默认会30分钟后进行销毁。
   tomcat配置文件web.xml中有如下配置:
    <session-config>
       <session-timeout>30</session-timeout>
   </session-config>
2.也可以立刻销毁 session.invalidate()。
3.还可以设置过期时间 session.setMaxInactiveInterval(秒);
4.关闭服务器。

方法返回值描述
invalidate()void使此会话无效,然后取消对任何绑定到它的对象的绑定。 销毁Session对象
setMaxInactiveInterval(int s)void设置过期时间

3.5 Session 的代码演示

获取Session域对象并存取数据

package com.itheima.session;

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("/cun")
public class CunSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("当浏览器第一访问 服务器的时候");
        System.out.println("服务器可以 为当前浏览器构建一个session对象");
        HttpSession session = request.getSession();
        //  特点 如果浏览器没有 jsessionid 那么就是新建一个
        //  如果有且在session池中找到了  该方法就是获取方法
        //获取session 创建的新session 有一个id
        System.out.println("查看session的id:"+session.getId());
        //服务器会自己 偷偷把我们的 session的id  封装成 new Cookie("JSESSIONID",id值)
                                           // 存到响应头中
        //我还想 把一个数据存到session中 实现会话中的数据共享
        session.setAttribute("goods","大金砖");//这个域 是会话域 只在这次会话中有效

        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("一个新的session对象产生了,id是:"+session.getId()+
                "<br/>我们还往session存储了数据");

    }
}

观察:响应有了 jsessionid 对 jsessioid

同一会话先访问/session1向域中存数据,再访问session2从Session域中取数据

package com.itheima.session;

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("/qu")
public class QuSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("当浏览器再次 服务器的时候");
        System.out.println("如果还在这次会话中,getSession获取的session就是上一个session ");
        HttpSession session = request.getSession();
        //  特点 如果浏览器没有 jsessionid 那么就是新建一个
        //  如果有且在session池中找到了  该方法就是获取方法
        //获取session 创建的新session 有一个id
        System.out.println("查看session的id:"+session.getId());
       //从域中取数据
        Object goods = session.getAttribute("goods");//这个域 是会话域 只在这次会话中有效

        System.out.println("取出的物品是:"+goods);

        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("再次访问服务器,是找到之前的session,sessionid是:"+session.getId()+
                "<br/>我们从session中取了数据"+goods);

    }
}

观察 :取得时候,再次访问了看到了 大金块 说明数据实现了会话域共享,而且访问的时候带着令牌去访问的,所以可以获取之前存的数据。

但是浏览器以Cookie的形式保存Session对象的id,默认生命周期是一次会话有效

总结:

同一会话访问/cun,发现浏览器Cookie中保存的id和代码输出到控制台的id是相同的
接着访问/qu,发现控制台输出的id和前面一样,
说明/qu对应的Servlet中并没有创建新的Session对象 

持久化Session对象(只需要持久化Session对应的id)

package com.itheima.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/sessionlong")
public class SessionLongServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //想要持久化jessionid 怎么做呢
        System.out.println("先获取我们session 如果有就获取 ,没有就新建");
        HttpSession session = request.getSession();
        System.out.println("当前session对象的id是:"+session.getId());
        //我们 之前的jsession遵循默认规则  我们可以显性化
        Cookie jsessionid = new Cookie("JSESSIONID", session.getId());
        jsessionid.setMaxAge(60*10);
        jsessionid.setPath(request.getContextPath());//设置路径为项目路径
        //存到响应头
        response.addCookie(jsessionid);

        response.getWriter().write("see this session:"+session.getId());

    }
}

总结

如果想  关闭浏览器再打开访问的session是同一个,只需我们修改jsessionid的存活时间即可。
作为面试题出现,开发不做。
session什么时候失效呢?
    服务器关闭
    从浏览器的角度,默认情况关闭浏览器,会话就结束。
    服务器中默认 session是30分钟。
    可以手动让session销毁 session.invalidate();

第四章 综合案例

4.1 简易购物车案例

效果

分析

准备页面(直接放在/web根目录下)

index.html页面内容

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>研究cookie和session</title>
    </head>
    <body>
       <h1>欢迎来购物</h1>
       <a href="meat.html">买肉</a>&nbsp;&nbsp;
       <a href="ball.html">买球</a>&nbsp;&nbsp;
    </body>
</html>

 meat.html页面内容

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h4>各种肉大甩卖,一律十块:</h4>
        <form name="Meet" id="Meat" action="/WEB07/cart" method="post">
            <input type="checkbox" name="goods" value="鸡肉">鸡肉<br>
            <input type="checkbox" name="goods" value="牛肉">牛肉<br>
            <input type="checkbox" name="goods" value="羊肉">羊肉<br><br>
            <input type="submit" value="提交">
            <input type="reset" value="全部重写"><br><br>
            <a href="ball.html">买点别的</a>&nbsp;&nbsp;<a href="showCart.jsp">查看购物车</a>
        </form>
    </body>
</html>

ball.html页面内容

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h4>各种球大甩卖,一律八块</h4>
        <form action="/WEB07/cart" method="post" name="Ball" id="ball">
            <input type="checkbox" name="goods" value="篮球">篮球<br>
            <input type="checkbox" name="goods" value="足球">足球<br>
            <input type="checkbox" name="goods" value="排球">排球<br><br>
            <input type="submit" value="提交">
            <input type="reset" value="全部重写"><br><br>
            <a href="meat.html">买点别的</a>&nbsp;&nbsp;<a href="showCart.jsp">查看购物车</a>
        </form>
    </body>
</html>

showCart.jsp页面内容

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<html>
    <head>
        <title>显示购物车内容</title>
    </head>
    <body>
        <h3>你选择的结果是:</h3>
        <%
            Set<String> cart = (Set<String>) session.getAttribute("cart");        
            if (cart != null && cart.size() > 0) {
                for (String s : cart) {
                    out.println(s);
                }
            }
        %>
    </body>
</html>

CartServlet类内容

@WebServlet("/cart")
public class CartServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        										throws ServletException, IOException {
        // 1:获取  页面提交 需要加入购物车的  商品
        request.setCharacterEncoding("utf-8");
        String[] goods = request.getParameterValues("goods");
        //从域中获取一个购物车对象  其实就是商品列表信息
        Set<String> cart = (Set<String>) request.getSession().getAttribute("cart");
        // 判断
        if (cart == null) {
            //购物车是空的
            cart = new HashSet<>();
            if (goods != null && goods.length > 0) {
                // 将数组中数据 收集到指定的 集合中
                Collections.addAll(cart, goods);
            }
        } else {
            // 往里面追加
            if (goods != null & goods.length > 0) {
                // 将数组中数据 收集到指定的 集合中
                Collections.addAll(cart, goods);
            }
        }
        //购物车完成了更新
        // 存到session中
        request.getSession().setAttribute("cart", cart);
        //自己做个遍历
        for (String s : cart) {
            System.out.println(s);
        }
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("<h1>添加购物车成功!</h1> <br/> <a href='index.html'>跳回主页</a><br/><a href='showCart.jsp'>查看购物车列表</a>");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 													throws ServletException, IOException {
        doGet(request, response);
    }
}

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

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

相关文章

URL到页面: 探索网页加载的神秘过程

当我们从浏览器的地址栏输入 URL, 按下回车, 再到最后出现需要的网页界面, 这中间究竟发生了什么, 接下来就一步步进行解析. 主要是如下过程: 输入网址DNS 解析客户端发送 HTPP 请求建立 TCP 连接服务器处理请求, 计算响应, 返回响应浏览器渲染页面关闭连接 本篇中只是概述整…

AUTOSAR-OS的调度机制-调度表(没理解透,继续更新)

什么是调度表&#xff1a; 1. 调度表由一系列按时间先后顺序排序的终结点组成&#xff0c;其中每个终结点都有自己的任务&#xff0c;有的终结点可能是激活一系列的任务&#xff0c;有的是设置一系列的事件&#xff0c;还有的可能是既激活一系列的任务又设置一系列的事件。 调…

数据结构之庖丁解牛八大排序算法,附动图说明过程(上)

目录 一、排序的概念以及应用 二、常见排序算法的实现 1.插入排序 1.1直接插入排序 b.实现直接插入排序 1.2希尔排序&#xff08;缩小增量排序&#xff09; 2.选择排序 2.1直接选择排序 2.2堆排序 3.交换排序 3.1冒泡排序 一、排序的概念以及应用 1.排序的概念 所谓排序&#x…

Mysql数据库--修改root密码的几种方法(忘记密码知道密码)

Mysql数据库--修改root密码的几种方法&#xff08;忘记密码&知道密码&#xff09; &#x1f53b;一、知道密码情况--修改root密码⛳ 1.1 方式1&#xff1a;alter 命令修改⛳ 1.2 方式2&#xff1a;set password命令修改 &#x1f53b;二、忘记密码情况-修改root密码⛳ 2.1 …

华为OD机试真题 Java 实现【找车位】【2023 B卷 100分】,附详细解题思路

一、题目描述 停车场有一横排车位&#xff0c;0代表没有停车&#xff0c;1代表有车。至少停了一辆车在车位上&#xff0c;也至少有一个空位没有停车。 为了防剐蹭&#xff0c;需为停车人找到一个车位&#xff0c;使得距停车人的车最近的车辆的距离是最大的&#xff0c;返回此…

打造高质量视频,创造视觉奇观!Camtasia 2023为你升级!

嘿&#xff0c;伙计&#xff01; 在这个全新版本中&#xff0c;我们迎来了焕然一新的动画控制和更简化的特效制作流程&#xff0c;让创作变得更高效。 不仅如此&#xff0c;全新的背景去除和动画光标功能也让视频拥有全新的视觉体验。让我们先谈谈光标&#xff0c;这个细节或…

计算机视觉:风格迁移

风格迁移 本节将介绍如何使用卷积神经网络&#xff0c;自动将一个图像中的风格应用在另一图像之上&#xff0c;即风格迁移&#xff08;style transfer&#xff09; (Gatys et al., 2016)。 这里我们需要两张输入图像&#xff1a;一张是内容图像&#xff0c;另一张是风格图像。…

Mac使用DBeaver连接达梦数据库

Mac使用DBeaver连接达梦数据库 下载达梦驱动包 达梦数据库 在下载页面随便选择一个系统并下载下来。 下载下来的是zip的压缩包解压出来就是一个ISO文件&#xff0c;然后我们打开ISO文件进入目录&#xff1a;/dameng/source/drivers/jdbc 进入目录后找到这几个驱动包&#x…

Vue 2和Vue 3路由Router创建的区别简记(在main.js文件中引入的区别和router的js文件中创建语法的区别)

Vue 2和Vue 3路由Router创建的区别即Router3.0和Router4.0的创建区别简记 1、版本的搭配&#xff1a; Vue 2到Vue 3的改版升级&#xff0c;同样的带来Vue Router的升级。创建Vue项目之后&#xff0c;我们可以在package.json文件中看到&#xff0c;Vue 2创建的项目往往是与Vue…

C++ | 拷贝文件

C拷贝文件 文章目录 C拷贝文件ANSI-C-WAYPOSIX-WAY (K&R use this in "The C programming language", more low-level)KISS-C-Streambuffer-WAYCOPY-ALGORITHM-C-WAYOWN-BUFFER-C-WAYLINUX-WAY理智的方式C 17Reference欢迎关注公众号【三戒纪元】 列举了几种拷贝…

nestjs超详细从零到零点五详细入门项目搭建过程

nestjs超详细从零到零点五详细入门项目搭建过程 项目完整地址github&#xff0c;修复了一些swagger文档接口&#xff0c;传参显示问题 从零到有搭建一个完整的后台管理系统项目 涉及到的知识 controller控制器provider提供者module模块middleware中间件filter过滤器pipe管道…

简明Python教程

前言&#xff1a;学习《简明 Python 教程》Swaroop, C. H. 著 沈洁元 译 www.byteofpython.info 摘录&#xff0c;方便以后使用查阅。 基础概念 常量 Python中有4种类型的数——整数、长整数、浮点数和复数。 2是一个整数的例子。长整数不过是大一些的整数。3.23和52.3E-4是…

高标准农田信息化管理平台概要设计

1、综合信息一张图系统 通过一张图的形式&#xff0c;可视化直观展示地区土地分布、耕地质量、高标准农田建设情况、灌溉情况、设备分布情况及环境监测数据。农业管理者可在一张图上查看农田相关信息&#xff0c;及时了解农田情况&#xff0c;为农田管理者的精准管理和科学决策…

Axure教程—拖拽获取(中继器+动态面板 )

本文将教大家如何用AXURE中的中继器和动态面板制作拖拽获取效果 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://68e5b3.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87874085?spm1001.2014.3001.5503 二、功能介绍 …

OpenMMLab-AI实战营第二期——2-2.基于RTMPose的耳朵穴位关键点检测(Colab+MMPose)

文章目录 1. Colab和Google云端硬盘1.1 建立项目文件和jupyter文件1.2 Colab运行时选择1.3 关联Colab中的文件和Google云端硬盘的文件 2. Colab和MMPose2.1 环境配置2.2 配置文件修改 3. Colab相关知识 视频链接&#xff1a;B站-RTMPose关键点检测-安装MMDetection和MMPose 1.…

一篇文章搞定Java中常用集合的排序方法

目录 Array 数组 List 列表 Collections.sort() 简单类型 复杂对象 类 使用Lambda表达式 Stream API Map 键值对 对 Map 的 Key 进行排序 对 Map 的 Value 进行排序 最近在做算法题的时候&#xff0c;发现排序在大部分题中都不可或缺&#xff0c;今天心血来潮&am…

Vue配置proxy代理,但接口报错2007 bad domain

1、排查proxy代理配置是否有误 排查 proxyTable 对象中配置的 target 是否正确。若正确&#xff0c;那可能就是请求头的问题。 无特殊配置的情况下&#xff0c;请求头是这样子的&#xff1a; Host 和 Referer 是本地地址&#xff0c;如果后端增加 CSRF 防御机制&#xff0c;…

【JDBC:连接MySQL数据库】出现SQL注入的解决办法、什么时候需要使用SQL注入、事务的使用、悲观锁乐观锁

JDBC JDBC是什么&#xff1f; Java Database Connectivity&#xff08;java语言连接数据库&#xff09; java.sql.*;&#xff08;这个包下有很多接口&#xff09; JDBC的本质是什么&#xff1f; JDBC的本质是SUN公司制定的一套接口&#xff08;interface&#xff09; 接口都有…

【C语言】数据以及位运算

位和位运算 C语言中数据的表示方法各种数据类型可表示的数值范围位和CHAR_BITsizeof运算符整型的内部表示无符号整数的内部表示有符号整数的内部表示 位运算位运算符位与运算位或运算位异或运算位取反运算位左移运算符位右移运算符逻辑位移与算术位移 C语言中数据的表示方法 各…

HCIA-RS实验-路由配置-OSPF 单区域配置

OSPF&#xff08;Open Shortest Path First&#xff09;是一种基于链路状态的路由协议&#xff0c;常用于大型企业网络中。在一个单区域的OSPF网络中&#xff0c;所有的路由器都属于同一个区域&#xff0c;这种配置方式相对简单直观。本文将介绍OSPF单区域的配置方法。 这篇文章…