javaWeb核心05-FilterListenerAjax

news2024/11/28 6:44:30

文章目录

    • Filter&Listener&Ajax
    • 1,Filter
      • 1.1 Filter概述
      • 1.2 Filter快速入门
        • 1.2.1 开发步骤
        • 1.2.2 代码演示
      • 1.3 Filter执行流程
      • 1.4 Filter拦截路径配置
      • 1.5 过滤器链
        • 1.5.1 概述
        • 1.5.2 代码演示
        • 1.5.3 问题
      • 1.6 案例
        • 1.6.1 需求
        • 1.6.2 分析
        • 1.6.3 代码实现
          • 1.6.3.1 创建Filter
          • 1.6.3.2 编写逻辑代码
          • 1.6.3.3 测试并抛出问题
          • 1.6.3.4 问题分析及解决
          • 1.6.3.5 过滤器完整代码
    • 2,Listener
      • 2.1 概述
      • 2.2 分类
      • 2.3 代码演示

Filter&Listener&Ajax

今日目标:

  • 能够使用 Filter 完成登陆状态校验功能
  • 能够使用 axios 发送 ajax 请求
  • 熟悉 json 格式,并能使用 Fastjson 完成 java 对象和 json 串的相互转换
  • 使用 axios + json 完成综合案例

1,Filter

1.1 Filter概述

Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。Servlet 我们之前都已经学习过了,Filter和Listener 我们今天都会进行学习。

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)

在这里插入图片描述

而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter,如下图

在这里插入图片描述

拦截器拦截到后可以做什么功能呢?

过滤器一般完成一些通用的操作。比如每个资源都要写一些代码完成某个功能,我们总不能在每个资源中写这样的代码吧,而此时我们可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。

我们之前做的品牌数据管理的案例中就已经做了登陆的功能,而如果我们不登录能不能访问到数据呢?我们可以在浏览器直接访问首页 ,可以看到 查询所有 的超链接

在这里插入图片描述

当我点击该按钮,居然可以看到品牌的数据

在这里插入图片描述

这显然和我们的要求不符。我们希望实现的效果是用户如果登陆过了就跳转到品牌数据展示的页面;如果没有登陆就跳转到登陆页面让用户进行登陆,要实现这个效果需要在每一个资源中都写上这段逻辑,而像这种通用的操作,我们就可以放在过滤器中进行实现。这个就是权限控制,以后我们还会进行细粒度权限控制。过滤器还可以做 统一编码处理敏感字符处理 等等…

1.2 Filter快速入门

1.2.1 开发步骤

进行 Filter 开发分成以下三步实现

  • 定义类,实现 Filter接口,并重写其所有方法

在这里插入图片描述

  • 配置Filter拦截资源的路径:在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源

    在这里插入图片描述

  • 在doFilter方法中输出一句话,并放行

    在这里插入图片描述

    上述代码中的 chain.doFilter(request,response); 就是放行,也就是让其访问本该访问的资源。

1.2.2 代码演示

创建一个项目,项目下有一个 hello.jsp 页面,项目结构如下:
在这里插入图片描述
在这里插入图片描述

pom.xml 配置文件内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.whu</groupId>
  <artifactId>filter-demo</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>80</port>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

servlet的scope一定别忘了,否则打进var包和tomcat自带的servlet冲突会报以下错误
在这里插入图片描述

hello.jsp 页面内容如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>hello JSP~</h1>
</body>
</html>

我们现在在浏览器输入 http://localhost/filter-demo/hello.jsp 访问 hello.jsp 页面,这里是可以访问到 hello.jsp 页面内容的。

在这里插入图片描述

接下来编写过滤器。过滤器是 Web 三大组件之一,所以我们将 filter 创建在 com.itheima.web.filter 包下,起名为 FilterDemo

@WebFilter("/*")
public class FilterDemo implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FilterDemo...");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

重启启动服务器,再次重新访问 hello.jsp 页面,这次发现页面没有任何效果,但是在 idea 的控制台可以看到如下内容

在这里插入图片描述

上述效果说明 FilterDemo 这个过滤器的 doFilter() 方法执行了,但是为什么在浏览器上看不到 hello.jsp 页面的内容呢?这是因为在 doFilter() 方法中添加放行的方法才能访问到 hello.jsp 页面。那就在 doFilter() 方法中添加放行的代码

//放行
 chain.doFilter(request,response);

再次重启服务器并访问 hello.jsp 页面,发现这次就可以在浏览器上看到页面效果。

FilterDemo 过滤器完整代码如下:

/*配置拦截路径 '/*' 表示所有的都拦截  */
@WebFilter("/*")
public class FilterDemo implements Filter {

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FilterDemo...");

        //放行得写明确放行代码 (否则卡在这里就不执行了)
        filterChain.doFilter(servletRequest,servletResponse);
    }

    // 生命周期相关方法,不用多说
    public void init(FilterConfig filterConfig) throws ServletException {}
    public void destroy() {}
}

1.3 Filter执行流程

在这里插入图片描述

如上图是使用过滤器的流程,我们通过以下问题来研究过滤器的执行流程:

  • 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?

    从上图就可以看出肯定 回到Filter中

  • 如果回到Filter中,是重头执行还是执行放行后的逻辑呢?

    如果是重头执行的话,就意味着 放行前逻辑 会被执行两次,肯定不会这样设计了;所以访问完资源后,会回到 放行后逻辑,执行该部分代码。

Filter确实会回来的,但是回来后是接着chain.doFilter(servletRequest,servletResponse);下一行代码开始执行,之前的代码不会被执行了

通过上述的说明,我们就可以总结Filter的执行流程如下:

在这里插入图片描述

接下来我们通过代码很好地验证一下,在 doFilter() 方法前后都加上输出语句,如下

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        //1. 放行前,(可以对request数据进行处理)
        System.out.println("1.FilterDemo... 放行前");

        //放行 (放行前response里其实没有数据)
        filterChain.doFilter(request,response);

        //2. 放行后,(可以对response数据进行处理)
        System.out.println("3.FilterDemo... 放行后");
    }

同时在 hello.jsp 页面加上输出语句,如下

在这里插入图片描述

执行访问该资源打印的顺序是按照我们标记的标号进行打印的话,说明我们上边总结出来的流程是没有问题的。启动服务器访问 hello.jsp 页面,在控制台打印的内容如下:

在这里插入图片描述

以后我们可以将对请求进行处理的代码放在放行之前进行处理,而如果请求完资源后还要对响应的数据进行处理时可以在放行后进行逻辑处理。

1.4 Filter拦截路径配置

拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用 @WebFilter 注解进行配置。如:@WebFilter("拦截路径")

拦截路径有如下四种配置方式:

  • 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
  • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
  • 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
  • 拦截所有:/*:访问所有资源,都会被拦截
  • 案例演示:拦截具体资源
    (FilterDemo的"/*"拦截得去掉)
    在这里插入图片描述
    1)访问:hello.jsp http://localhost/filter-demo/hello.jsp
    在这里插入图片描述
    说明过滤器拦截了hello.jsp

1)访问:index.jsp http://localhost/filter-demo/index.jsp
在这里插入图片描述
说明过滤器没有拦截hello.jsp


通过上面拦截路径的学习,大家会发现拦截路径的配置方式和 Servlet 的请求资源路径配置方式一样,但是表示的含义不同。


1.5 过滤器链

1.5.1 概述

过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。

如下图就是一个过滤器链,我们学习过滤器链主要是学习过滤器链执行的流程

在这里插入图片描述

上图中的过滤器链执行是按照以下流程执行:

  1. 执行 Filter1 的放行前逻辑代码
  2. 执行 Filter1 的放行代码
  3. 执行 Filter2 的放行前逻辑代码
  4. 执行 Filter2 的放行代码
  5. 访问到资源
  6. 执行 Filter2 的放行后逻辑代码
  7. 执行 Filter1 的放行后逻辑代码

以上流程串起来就像一条链子,故称之为过滤器链。

1.5.2 代码演示

  • 编写第一个过滤器 FilterDemo ,配置成拦截所有资源

    @WebFilter("/*")
    public class FilterDemo implements Filter {
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            //1. 放行前,(可以对request数据进行处理)
            System.out.println("1.FilterDemo... 过滤器1放行前");
    
            //放行 (放行前response里其实没有数据)
            filterChain.doFilter(request,response);
    
            //2. 放行后,(可以对response数据进行处理)
            System.out.println("5.FilterDemo... 过滤器1放行后");
        }	
        // 生命周期相关方法,不用多说
        public void init(FilterConfig filterConfig) throws ServletException { }
        public void destroy() { }
    }
    
  • 编写第二个过滤器 FilterDemo2 ,配置炒年糕拦截所有资源

    @WebFilter("/*")
    public class FilterDemo2 implements Filter {
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            //1. 放行前,(可以对request数据进行处理)
            System.out.println("2.FilterDemo... 过滤器2放行前");
    
            //放行 (放行前response里其实没有数据)
            filterChain.doFilter(request,response);
    
            //2. 放行后,(可以对response数据进行处理)
            System.out.println("4.FilterDemo... 过滤器2放行后");
        }
    
        // 生命周期相关方法,不用多说
        public void init(FilterConfig filterConfig) throws ServletException { }
        public void destroy() { }
    }
    
  • 修改 index.jsp 页面中脚本的输出语句

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <a href="hello.jsp">hello.jsp</a>
    <h1>index jsp</h1>
    <%
        System.out.println("3. index.jsp 资源文件");
    %>
    </body>
    </html>
    
    
  • 启动服务器,在浏览器输入 http://localhost/filter-demo/index.jsp 进行测试,在控制台打印内容如下

    在这里插入图片描述

    从结果可以看到确实是按照我们之前说的执行流程进行执行的。

1.5.3 问题

上面代码中为什么是先执行 FilterDemo ,后执行 FilterDemo2 呢?

我们现在使用的是注解配置Filter,而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序

比如有如下两个名称的过滤器 : BFilterDemoAFilterDemo 。那一定是 AFilterDemo 过滤器先执行。

1.6 案例

1.6.1 需求

访问服务器资源时,需要先进行登录验证,如果没有登录,则自动跳转到登录页面

1.6.2 分析

我们要实现该功能是在每一个资源里加入登陆状态校验的代码吗?显然是不需要的,只需要写一个 Filter ,在该过滤器中进行登陆状态校验即可。而在该 Filter 中逻辑如下:

在这里插入图片描述

1.6.3 代码实现

接着完善之前的 brand-demo 案例

1.6.3.1 创建Filter

brand-demo 工程创建 cn.whu.web.filter 包,在该下创建名为 LoginFilter 的过滤器

//登录验证的过滤器
@WebFilter("/*")
public class LoginFilter implements Filter {

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

    }

    public void init(FilterConfig filterConfig) throws ServletException { }
    public void destroy() { }
}
1.6.3.2 编写逻辑代码

doFilter() 方法中编写登陆状态校验的逻辑代码。

我们首先需要从 session 对象中获取用户信息,但是 ServletRequest 类型的 requset 对象没有获取 session 对象的方法,所以此时需要将 request对象强转成 HttpServletRequest 对象。

HttpServletRequest req = (HttpServletRequest) request;

然后完成以下逻辑

  • 获取Session对象
  • 从Session对象中获取名为 user 的数据
  • 判断获取到的数据是否是 null
    • 如果不是,说明已经登陆,放行
    • 如果是,说明尚未登陆,将提示信息存储到域对象中并跳转到登陆页面

代码如下:

//登录验证的过滤器
@WebFilter("/*")
public class LoginFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        if(user!=null){
            //登陆过了 放行
            chain.doFilter(request,response);
        }else {
            //未登录 跳转到登录界面
            request.setAttribute("login_msg","请先登录~");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }

    }

    public void init(FilterConfig filterConfig) throws ServletException { }
    public void destroy() { }
}
1.6.3.3 测试并抛出问题

先清除缓存,再在浏览器上输入 http://localhost:8080/brand-demo/ ,可以看到如下页面效果

在这里插入图片描述

从上面效果可以看出没有登陆确实是跳转到登陆页面了,但是登陆页面为什么展示成这种效果了呢?

1.6.3.4 问题分析及解决

因为登陆页面需要 css/login.css 这个文件进行样式的渲染,下图是登陆页面引入的css文件图解

在这里插入图片描述

而在请求这个css资源时被过滤器拦截,就相当于没有加载到样式文件导致的。解决这个问题,只需要对所有的登陆相关的资源进行放行即可。还有一种情况就是当我没有用户信息时需要进行注册,而注册时也希望被过滤器放行。

综上,我们需要在判断session中是否包含用户信息之前,应该加上对登陆及注册相关资源放行的逻辑处理

//判断访问资源路径是否和登录注册相关
//1,在数组中存储登陆和注册相关的资源路径
String[] urls = {"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
//2,获取当前访问的资源路径
String url = req.getRequestURL().toString(); 

//3,遍历数组,获取到每一个需要放行的资源路径
for (String u : urls) {
    //4,判断当前访问的资源路径字符串是否包含要放行的的资源路径字符串
    /*
    	比如当前访问的资源路径是  /brand-demo/login.jsp
    	而字符串 /brand-demo/login.jsp 包含了  字符串 /login.jsp ,所以这个字符串就需要放行
    */
    if(url.contains(u)){
        //找到了,放行
        chain.doFilter(request, response);
        //break;
        return;
    }
}
1.6.3.5 过滤器完整代码
//登录验证的过滤器
@WebFilter("/*")
public class LoginFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //登录注册相关的资源需要放行
        //方向列表
        String[] urls = {"/login.jsp", "/imgs/", "/css/", "/login", "/register.jsp", "/register", "/checkCode"};
        //获取本次访问路径
        String url = request.getRequestURL().toString();//要字符串形式的路径
        for (String u : urls) {
            if(url.contains(u)){
                //访问的是需要放行的资源
                chain.doFilter(request,response);
                return;//将来还会回来的 所以下面不能执行了 必须return
            }
        }

        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        if(user!=null){
            //登陆过了 放行
            chain.doFilter(request,response);
        }else {
            //未登录 跳转到登录界面
            request.setAttribute("login_msg","请先登录~");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }

    }

    public void init(FilterConfig filterConfig) throws ServletException { }
    public void destroy() { }
}

//TODO

2,Listener

2.1 概述

  • Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

  • 监听器可以监听就是在 applicationsessionrequest 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

    request 和 session 我们学习过。而 applicationServletContext 类型的对象。

    ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。

2.2 分类

JavaWeb 提供了8个监听器:

image-20210823230820586

这里面只有 ServletContextListener 这个监听器后期我们会接触到,ServletContextListener 是用来监听 ServletContext 对象的创建和销毁。

ServletContextListener 接口中有以下两个方法

  • void contextInitialized(ServletContextEvent sce)ServletContext 对象被创建了会自动执行的方法
  • void contextDestroyed(ServletContextEvent sce)ServletContext 对象被销毁时会自动执行的方法

2.3 代码演示

我们只演示一下 ServletContextListener 监听器

  • 定义一个类,实现ServletContextListener 接口
  • 重写所有的抽象方法
  • 使用 @WebListener 进行配置

代码如下:

@WebListener
public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //加载资源
        System.out.println("ContextLoaderListener...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //释放资源
    }
}

启动服务器,就可以在启动的日志信息中看到 contextInitialized() 方法输出的内容,同时也说明了 ServletContext 对象在服务器启动的时候被创建了。

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

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

相关文章

JavaScript Date(日期)对象

日期对象用于处理日期和时间。在线实例返回当日的日期和时间如何使用 Date() 方法获得当日的日期。getFullYear()使用 getFullYear() 获取年份。getTime()getTime() 返回从 1970 年 1 月 1 日至今的毫秒数。setFullYear()如何使用 setFullYear() 设置具体的日期。toUTCString()…

要做一个关于DDD的内部技术分享,记录下用到的资源,学习笔记(未完)

最后更新于2023年3月10日 14:28:08 问题建模》软件分层》具体结构&#xff0c;是层层递进的关系。有了问题建模&#xff0c;才能进行具体的软件分层的讨论&#xff0c;再有了分层&#xff0c;才能讨论在domain里面应该怎么实现具体结构。 1、问题建模&#xff1a;Domain、Mod…

手写模拟SpringMvc源码

MVC框架MVC是一种设计模式&#xff08;设计模式就是日常开发中编写代码的一种好的方法和经验的总结&#xff09;。模型&#xff08;model&#xff09;-视图&#xff08;view&#xff09;-控制器&#xff08;controller&#xff09;&#xff0c;三层架构的设计模式。用于实现前端…

无公网IP快解析实现移动app访问内网应用

随着移动化的发展&#xff0c;国内各大管理软件厂商纷纷推出相应的移动应用服务。移动端为企业提供了不一样的办公方式&#xff0c;从碎片化应用到一体化&#xff0c;同时也为企业办公提供了更高效便捷办公体验。 移动办公和传统pc端在服务器端部署时并没有太大的区别。企业为了…

数据、数据资源及数据资产管理的区别

整理不易&#xff0c;转发请注明出处&#xff0c;请勿直接剽窃&#xff01; 点赞、关注、不迷路&#xff01; 摘要&#xff1a;数据、数据资源、数据资产 数据、数据资源及数据资产的区别 举例 CRM系统建设完成后会有很多数据&#xff0c;这些数据就是原始数据&#xff0c;业务…

线程(操作系统408)

基本概念 我们说引入进程的目的是更好的使用多道程序并发执行&#xff0c;提高资源的利用率和系统吞吐量&#xff1b;而引入线程的目的则是减小程序在并发执行的时候所付出的时间开销&#xff0c;提高操作系统的并发性能。 线程可以理解成"轻量级进程"&#xff0c;…

Request和Response的概述

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章⭐作者主页&#xff1a;︶ㄣ释然⭐如果觉得文章写的不错&#xff0c;欢迎点个关注&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601;Request和Respo…

Flink之Source

Flink 可以从各种来源获取数据&#xff0c;然后构建 DataStream 进行转换处理。一般将数据的输入来源称为数据源&#xff0c;而读取数据的算子就是源算子&#xff08;Source&#xff09;。所以&#xff0c;Source 就是我们整个处理程序的输入端。Flink 代码中通用的添加 Source…

【零基础入门学习Python---Python的五大数据类型之数字类型】

一.Python的五大数据类型之数字类型 在Python中,变量用于存储数据。变量名可以是任何字母、数字和下划线的组合。Python支持多种数据类型,包括数字、字符串、列表、元组和字典。这篇文章我们就来学习一下五大数据类型中的数字类型。 1.1 数字类型 Python 中的数字类型主要…

【C语言蓝桥杯每日一题】—— 单词分析

【C语言蓝桥杯每日一题】—— 单词分析&#x1f60e;前言&#x1f64c;单词分析&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者…

JSP电动车充电运营管理系统用myeclipse定制开发mysql数据库mvc模式java编程servlet

一、源码特点 JSP 电动车充电运营管理系统 是一套完善的系统源码&#xff0c;对理解JSP java serlvet MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 研究的基本内容是基于Web的电动车充电运营管理系统&#xf…

论文笔记 | 标准误聚类问题

关于标准误的选择&#xff0c;如是否选择稳健性标准误、是否采取聚类标准误。之前一直是困惑的&#xff0c;惯用的做法是类似主题的文献做法。所以这一次&#xff0c;借计量经济学课程之故&#xff0c;较深入学习了标准误的选择问题。 在开始之前推荐一个知乎博主。他阅读了很…

ssl/tsl 加密原理

ssl/tsl 加密原理 对称加密 对称加密&#xff1a;即加密和解密用的都是同一个秘钥&#xff0c;主要优势就是速度比非对称加密快 非对称加密 非对称加密&#xff1a; 即加密和解密用的是不同的秘钥&#xff0c;例如&#xff1a;在服务端存在一对公钥和私钥&#xff0c;服务…

JWT令牌解析及刷新令牌(十一)

写在前面&#xff1a;各位看到此博客的小伙伴&#xff0c;如有不对的地方请及时通过私信我或者评论此博客的方式指出&#xff0c;以免误人子弟。多谢&#xff01;如果我的博客对你有帮助&#xff0c;欢迎进行评论✏️✏️、点赞&#x1f44d;&#x1f44d;、收藏⭐️⭐️&#…

mmdetection3d-之(三)--FCOS3d训练waymo数据集

本内容分为两部分 1. waymo数据集转KITTI格式2. FCOS3D训练KITTI格式的waymo数据集1 waymo数据集转kitti格式 1.1 waymo数据集简介 1.1.1 waymo数据集下载 waymo数据集v1.2.0可以从这里下载。其中&#xff0c;train&#xff08;32个压缩包&#xff09;&#xff0c;test&…

零入门kubernetes网络实战-22->基于tun设备实现在用户空间可以ping通外部节点(golang版本)

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章主要是想做一个测试&#xff1a; 实现的目的是 希望在宿主机-1上&#xff0c;在用户空间里使用ping命令发起ping请求&#xff0c;产生的icmp类型的…

从FVM上线前的测试网统计报告中看前景,Filecoin将会迎来什么变化?

FEVM将在2023/03/14主网上线&#xff01;在Calibration网络升级正式完成后&#xff0c;Filecoin V18 Hygge升级将于2023年3月14日&#xff08;π日&#xff09;正式上线&#xff01;此次升级将正式为Filecoin网络带来智能合约。基于FVM的可编程性。此次更新升级将释放数据经济的…

Spring Cloud Alibaba Sentinel 集群流量控制

为什么要进行集群流控 假设集群中有 10 台机器&#xff0c;我们给每台机器设置单机限流阈值为 10 QPS&#xff0c;理想情况下整个集群的限流阈值就为 100 QPS。不过实际情况下流量到每台机器可能会不均匀&#xff0c;会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机…

因特网基础

1、因特网的概述 1-1、网络、互联网和因特网 网络&#xff08;Network&#xff09;是由若干节点&#xff08;Node&#xff09;和连接这些节点的链路&#xff08;Link&#xff09;组成。 多个网络还可以通过路由器相互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&…

【刷题笔记】--双指针--189. 轮转数组

题目&#xff1a; 思路1&#xff1a; 再设一个数组&#xff0c;通过下标的规律&#xff0c;进行更新数组。 关于这个平移的下标规律&#xff1a;%numbersize&#xff1b; 假设数组1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7 要整体…