SpringMVC | Spring MVC中的“拦截器”

目录:

    • 拦截器 :
      • 1. 拦截器的 “概述”
      • 2. 拦截器的 “定义” (创建“拦截器”对象)
      • 3. 拦截器的 “配置” (让“拦截器”对象生效)
      • 4. 拦截器的 “执行流程”
        • “单个拦截器”的执行流程
        • “多个拦截器”的执行流程

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


实际项目中,拦截器使用是非常普遍 的,例如在购物网站中通过 拦截器 可以 拦截未登录的用户禁止其购买商品,或者 使用拦截器验证已登录用户是否有相应操作权限 等。在Struts2框架中,拦截器是其重要的组成部分,而 Spring MVC也提供了拦截器功能,通过配置即可对请求进行拦截处理

拦截器 :

1. 拦截器的 “概述”

SpringMVC 中的 拦截器( Interceptor ) 类似于 Servlet中的过滤器( Filter),它主要用于拦截用户请求并做相应的处理。例如通过拦截器可以进行 权限验证记录请求信息日志判断用户是否登录 等。

2. 拦截器的 “定义” (创建“拦截器”对象)

  • 要使用 SpringMVC中的拦截器,就需要对拦截器类进行定义配置。通常拦截器类可以通过 两种方式来定义

    • 一种是通过 实现 HandlerInterceptor接口,或 继承 HandlerInterceptor接口实现类HandlerInterceptorAdapter 来定义;
    • 另一种是通过 实现 WebRequestInterceptor接口,或 继承 WebRequestInterceptor接口实现类 来定义。
  • 例子如 :(实现HandlerInterceptor接口的方式来实现SpringMVC拦截器) :

    //通过实现HandlerInterceptor接口的方式来实现SPringMVC拦截器
    public class CustomerInterceptor implements HandlerInterceptor { 
    
        //该方法在“控制器方法”之前执行,其返回值表示“是否中断后续操作”
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception {
            return false;
        }
    
        //该方法在“控制器方法”之后执行,且“解析视图”之前执行(可通过该方法对“模型和视图”进一步修改)
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    
        }
    
        //该方法在“整个请求”完成之后执行,即“视图渲染结束”之后执行(通过该方法可进行“资源清理、记录日志信息等”)
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    
        }
    }
    

    上述代码可以看出,自定义拦截器类实现了HandlerInterceptor接口,并实现了 接口中的三个方法 。 关于这 三个方法具体描述 如下 :

    方法描述
    preHandler()方法该方法会在 控制器方法 之前执行,其 返回值 表示 是否中断后续操作
    当其返回值true 时,表示 继续向下执行
    当其返回值false 时,会 中断后续的所有操作 (包括调用下一个拦截器控制器类中的方法执行等)。
    postHandle()方法方法会在 控制器方法 之后执行,且 解析视图 之前执行。可以通过此方法请求域中的 模型视图 做出 进一步的修改
    afterCompletion()方法方法整个请求完成之后执行,即 视图渲染结束 之后执行。可以通过此方法实现一些资源清理记录日志信息等。

    要想让刚创建好的 拦截器”生效,就要在 springmvc-config.xml中进行配置让“拦截器”生效

3. 拦截器的 “配置” (让“拦截器”对象生效)

  • 使自定义拦截器生效,还需要在SpringMVC配置文件 : springmvc-config.xml 中进行配置

  • SpringMVC拦截器配置元素图 如下所示

    在这里插入图片描述

  • SpringMVC拦截器“在==springmvc-config.xml”== 中==配置代码== 如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
    	http://www.springframework.org/schema/beans
    	http://www.springframework.org/schema/beans/spring-beans.xsd
    	http://www.springframework.org/schema/mvc
    	http://www.springframework.org/schema/mvc/spring-mvc.xsd
    	http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 配置拦截器 -->
        <mvc:interceptors>
            <!-- 配置“全局拦截器”,拦截所有请求 -->
            <bean class="com.myh.interceptor.CustomerInterceptor"/>
    
            <!-- 配置“普通拦截器1”,拦截“指定路径”/“指定请求” -->
            <mvc:interceptor>
                <!-- 需要拦截的路径 -->
                <mvc:mapping path="/**"/>
                <bean class="com.myh.interceptor.CustomerInterceptor1"/>
            </mvc:interceptor>
    
            <!-- 配置“普通拦截器2” -->
            <mvc:interceptor>
                <!-- 需要拦截的路径 -->
                <!-- 拦截所有以 /hello 结尾的路径 -->
                <mvc:mapping path="/hello"/>
                <bean class="com.myh.interceptor.CustomerInterceptor2"/>
            </mvc:interceptor>
             .....
        </mvc:interceptors>
    </beans>
    

    上述配置代码中,<mvc:interceptors>元素用于配置一组拦截器,其子元素<bean>中定义的
    全局拦截器
    ,它会拦截所有的请求;而 <mvc:interceptor>元素 中定义的是指定路径拦截器
    它会对指定路径下的请求生效<mvc:interceptor> 元素子元素<mvc:mapping>用于配置拦截
    器作用路径,该路径在其属性path中定义。如上述代码中path属性值“/”** 表示拦截所有路径,“hello"表示拦截所有以"hello" 结尾的路径。如果在请求路径中包含不需要拦截的内容,还可以通过 <mvc:exclude- mapping>元素进行配置

    注意点 :
    需要注意的是,<mvc:interceptor>中的子元素必须按照上述代码配置顺序进行编写,即 <mvc:mapping> —> <mvc:exclude-mapping> —> <bean>顺序否则文件会报错

4. 拦截器的 “执行流程”

“单个拦截器”的执行流程
  • 运行程序 时,拦截器的执行一定顺序 的,该 顺序配置文件中所定义拦截器的顺序 相关。如果在项目只定义了一个拦截器,那么该拦截器程序中执行流程如图 如下图所示 :
    在这里插入图片描述

    上图 可以看出程序首先执行拦截器类 中的 preHandle( )方法,如果该方法的 返回值true ,则程序继续向下执行 处理器类中的方法否则不会向下执行 ,后执行 控制器类中方法
    执行完“控制器类中方法”后,会执行“拦截器类”中的 postHandle( )方法,然后会通过DispatcherServlet各户端返回响应;在DispatcherServlet处理完请求后,才会执行
    afterCompletion( )方法

  • 单个拦截器”的执行流程 例子如 :

    第一步创建项目,导入依赖
    Spring MVC所需JAR (百度网盘)

    第二步 :配置 SpringMVC拦截器相关文件 :

    web.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
    
        <!-- 配置"前端过滤器"-->
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--  配置springmvc-config.xml配置文件的位置 (上下文配置位置) -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-config.xml</param-value>
            </init-param>
            <!--  配置启动服务器时加载此配置文件,加载此servlet -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        
        <!--  配置Servlet的Mapper映射  -->
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    springmvc-config.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
    	http://www.springframework.org/schema/beans
    	http://www.springframework.org/schema/beans/spring-beans.xsd
    	http://www.springframework.org/schema/mvc
    	http://www.springframework.org/schema/mvc/spring-mvc.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 配置组件扫描,进行根包扫描,让注解生效 -->
        <context:component-scan base-package="com.myh.controller"/>
    
        <!-- 配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
        </bean>
    
        <!-- 配置SpringMVC 拦截器 -->
        <mvc:interceptors>
        <!-- 全局拦截器,会拦截所有请求 -->
        <bean class="com.myh.interceptor.CustomerInterceptor"/>
        </mvc:interceptors>
    
    </beans>
    

    HelloController.java (控制器类) :

    package com.myh.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller //标记该类为控制器类
    public class HelloController {
    
        /**
         * 页面跳转
         */
        @RequestMapping("/hello")
        public String Hello() {
            System.out.println("HelloController...Hello()");
            return "success"; //响应一个页面给前端
        }
    }
    

    CustomerInterceptor.java (拦截器对象) :

    package com.myh.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class CustomerInterceptor implements HandlerInterceptor { //通过实现HandlerInterceptor接口的方式来实现SPringMVC拦截器
    
        //该方法在“控制器方法”之前执行,其返回值表示“是否中断后续操作”
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object handler) throws Exception {
            //对拦截的请求放行
            return true;
        }
    
        //该方法在“控制器方法”之后执行,且“解析视图”之前执行(可通过该方法对“模型和视图”进一步修改)
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("CustomerInterceptor...postHandle()");
        }
    
        //该方法在“整个请求”完成之后执行,即“视图渲染结束”之后执行(通过该方法可进行“资源清理、记录日志信息等”)
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object handler, Exception e) throws Exception {
            System.out.println("CustomerInterceptor...afterCompletion()");
        }
    }
    

    success.jsp :

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>success.jsp页面</title>
    </head>
    <body>
    ok
    </body>
    </html>
    

    启动服务器前端访问 /hello控制台打印内容为
    在这里插入图片描述

    上图可以看出,程序先执行了拦截器类中的==preHandle( )方法,然后执行了控制器中Hello( )方法,最后分别执行了拦截器类中的postHandle( )方法afterCompletion( )方法。这上文所描述单个拦截器的执行顺序一致的==。

“多个拦截器”的执行流程
  • 大型的企业级项目 中,通常 不会只有一个拦截器开发人员可能会定义 多个拦截器实现不同的功能
    多个拦截器执行顺序 如下图
    在这里插入图片描述

    上图可以看出,当有 "多个拦截器"同时工作 时,它们的 preHandle( )方法 会按照配置文件中 拦截器"配置顺序"执行,而它们的 postHandle( )方法afterCompletion( )方法 则会按照 配置顺序反序执行

  • 多个拦截器执行流程 例子如 :

    第一步创建项目,导入依赖
    Spring MVC所需JAR (百度网盘)

    第二步 :配置 SpringMVC拦截器相关文件 :

    web.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
    
        <!-- 配置"前端过滤器"-->
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--  配置springmvc-config.xml配置文件的位置 (上下文配置位置) -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-config.xml</param-value>
            </init-param>
            <!--  配置启动服务器时加载此配置文件,加载此servlet -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        
        <!--  配置Servlet的Mapper映射  -->
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    springmvc-config.xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
    	http://www.springframework.org/schema/beans
    	http://www.springframework.org/schema/beans/spring-beans.xsd
    	http://www.springframework.org/schema/mvc
    	http://www.springframework.org/schema/mvc/spring-mvc.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 配置组件扫描,进行根包扫描,让注解生效 -->
        <context:component-scan base-package="com.myh.controller"/>
    
        <!-- 配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
        </bean>
    
       <!--  定义两个拦截器  -->
        <mvc:interceptors>
            <!--  拦截器1  -->
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.myh.interceptor.Interceptor1"/>
            </mvc:interceptor>
    
            <!--  拦截器2 -->
            <mvc:interceptor>
                <mvc:mapping path="/hello"/>
                <bean class="com.myh.interceptor.Interceptor2"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
    </beans>
    

    上述拦截器配置代码中,第一个拦截器会作用于所有路径下请求,而 第二个拦截器 会作用于以 “hello" 结尾请求

    HelloController.java (控制器类) :

    package com.myh.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller //标记该类为控制器类
    public class HelloController {
    
        /**
         * 页面跳转
         */
        @RequestMapping("/hello")
        public String Hello() {
            System.out.println("HelloController...Hello()");
            return "success"; //响应一个页面给前端
        }
    }
    

    Interceptor1.java (拦截器对象1) :

    package com.myh.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    /**
     * 如果有多个拦截器,preHandle()方法按照拦截器的“顺序执行”,
     * postHandle()方法 和 afterCompletion()方法按照拦截器的“逆序执行”
     */
    public class Interceptor1 implements HandlerInterceptor {//以实现HandlerInterceptor接口的方式定义拦截器
    
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception {
            System.out.println("Interceptor1...preHandle()");
            return true;   //对拦截的请求放行
        }
    
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            System.out.println("Interceptor1...postHandle()");
        }
    
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            System.out.println("Interceptor1...afterCompletion()");
        }
    }
    

    Interceptor2.java (拦截器对象2) :

    package com.myh.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     * 如果有多个拦截器,preHandle()方法按照拦截器的“顺序执行”,
     * postHandle()方法 和 afterCompletion()方法按照拦截器的“逆序执行”
     */
    public class Interceptor2 implements HandlerInterceptor {//以实现HandlerInterceptor接口的方式定义拦截器
    
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception {
            System.out.println("Interceptor2...preHandle()");
            return true;   //对拦截的请求放行
        }
    
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            System.out.println("Interceptor2...postHandle()");
        }
    
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            System.out.println("Interceptor2...afterCompletion()");
        }
    }
    

    success.jsp :

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>success.jsp页面</title>
    </head>
    <body>
    ok
    </body>
    </html>
    

    启动服务器前端访问 /hello控制台打印内容为
    在这里插入图片描述

    控制体输出信息可以看出,程序 先执行前两个拦截器类 中的 preHandle( )方法,这 两个方法执行顺序配置文件中定义顺序相同;然后执行了控制器类中的 Hello( )方法; 最后执行了两个拦截器类中的 postHandle( )方法afterCompletion( )方法 ,且这两个方法的 执行顺序 与配置文件中所 定义 的拦截器 顺序相反

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sentinel整合gateway实现服务限流

导入依赖: <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><…

LeetCode_Java_递归系列(题目+思路+代码)

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]以此类推&#xff0c;直到反转结束返回头结点 class Solution {public ListNode rever…

仅用一个月,游卡完成从MySQL到上线OceanBase的实践

编者按&#xff1a;自2023年9月起&#xff0c;游卡——国内最早卡牌游戏研发者之一&#xff0c;开始测试OceanBase&#xff0c;并在短短两个月内成功将三个核心业务应用迁移至OceanBase上。究竟是何因素促使游卡放弃游戏行业普遍采用的MySQL方案&#xff0c;转而大胆选择OceanB…

微服务网关介绍

1. 为什么是Spring Cloud Gateway 一句话&#xff0c;Spring Cloud已经放弃Netflix Zuul了。现在Spring Cloud中引用的还是Zuul 1.x版本&#xff0c;而这个版本是基于过滤器的&#xff0c;是阻塞IO&#xff0c;不支持长连接。Zuul 2.x版本跟1.x的架构大一样&#xff0c;性能也有…

图像分割论文阅读:Adaptive Context Selection for Polyp Segmentation

这篇论文的主要内容是关于一种用于息肉分割的自适应上下文选择网络&#xff08;Adaptive Context Selection Network&#xff0c;简称ACSNet&#xff09; 1&#xff0c;模型的整体结构 模型的整体结构基于编码器-解码器框架&#xff0c;并且包含了三个关键模块&#xff1a;局部…

【文末附gpt升级4.0方案】FastGPT详解

FastGPT知识库结构讲解 FastGPT是一个基于GPT模型的知识库&#xff0c;它的结构可以分为以下几个部分&#xff1a; 1. 数据收集&#xff1a;FastGPT的知识库是通过从互联网上收集大量的文本数据来构建的。这些数据可以包括维基百科、新闻文章、论坛帖子等各种类型的文本。 2…

HTML静态网页成品作业(HTML+CSS+JS)——中华美食八大菜系介绍(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播切换&#xff0c;共有1个页面。 二、…

探索国内ip切换App:打破网络限制

在国内网络环境中&#xff0c;有时我们会遇到一些限制或者屏蔽&#xff0c;使得我们无法自由访问一些网站或服务。而国内IP切换App的出现&#xff0c;为解决这些问题提供了非常便捷的方式。这些App可以帮助用户切换IP地址&#xff0c;让用户可以轻松地访问被限制或屏蔽的网站&a…

超越 GPT-4V 和 Gemini Pro!HyperGAI 发布最新多模态大模型 HPT,已开源

随着AI从有限数据迈向真实世界&#xff0c;极速增长的数据规模不仅赋予了模型令人惊喜的能力&#xff0c;也给多模态模型提供了更多的可能性。OpenAI在发布GPT-4V时就已经明确表示&#xff1a; 将额外模态&#xff08;如图像输入&#xff09;融入大语言模型&#xff08;LLMs&am…

鸿蒙一次开发,多端部署(一)简介

背景 随着终端设备形态日益多样化&#xff0c;分布式技术逐渐打破单一硬件边界&#xff0c;一个应用或服务&#xff0c;可以在不同的硬件设备之间随意调用、互助共享&#xff0c;让用户享受无缝的全场景体验。而作为应用开发者&#xff0c;广泛的设备类型也能为应用带来广大的…

Unity访问安卓(Android)或苹果(iOS)相册

1.下载Native Gallery for Android & iOS插件 2.在场景中添加截图按钮、选择图片按钮、选择视频按钮等 using OpenCVForUnity.CoreModule; using OpenCVForUnity.ImgprocModule; using OpenCVForUnity.UnityUtils; using System.Collections; using System.Collections.Gen…

线段树+暴力区修 P4145 上帝造题的七分钟 2 / 花神游历各国

传送门https://www.luogu.com.cn/problem/P4145 这道题着实想了好久&#xff0c;本来想的是用数学方法找规律&#xff0c;结果写了好久&#xff0c;发现想假了&#xff0c;于是只好看思路&#xff0c;暴力区修&#xff01;原因是被开根号一定次数就会变成1&#xff0c;是有限的…

安卓studio连接手机之后,一两秒之后就自动断开了。问题解决。

太坑了&#xff0c;安卓studio链接手机之后。几秒之后就断开了。我以为是adb的问题&#xff0c;就重新安装了一下adb。并且在环境变量中配置了Path的路径。然而并没有什么用啊。 后来查看是wps的服务和ADB有冲突。直接把WPS卸载掉之后就没有出现链接手机闪现的的问题。

网络通信——IP地址、端口号、协议(TCP、UDP)

通信架构 网络通信三要素 IP地址 IPv4地址 IPv6地址 IP域名 IP常识 端口号 概念 协议 开放式网络互联标准&#xff1a;OSI、TCP/IP 传输层的2个通信协议——UDP、TCP TCP协议&#xff1a;三次握手建立建立可靠连接 进行三次握手的原因&#xff1a;为了确保客户端和服务端…

在基于Android相机预览的CV应用程序中使用 OpenCL

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0在Android 开发简介 下一篇&#xff1a;在 MacOS 中安装 本指南旨在帮助您在基于 Android 相机预览的 CV 应用程序中使用 OpenCL ™。教程是为 Android Studio 20…

复习斐波那契(用C++写)

或者这样写&#xff1a; 斐波那契数列 题目描述 斐波那契数列是指这样的数列&#xff1a;数列的第一个和第二个数都为 1 1 1&#xff0c;接下来每个数都等于前面 2 2 2 个数之和。 给出一个正整数 a a a&#xff0c;要求斐波那契数列中第 a a a 个数是多少。 输入格式…

霍格沃兹测试开发从人员外包到测试工具、测试平台,提供全方位的测试解决方案~

随着学社的学员越来越多&#xff0c;影响力越来越大&#xff0c;不停有学员和企业问我们&#xff1a;能否提供人员外包服务&#xff1f;与此同时&#xff0c;企业对于外包人员的业务技能要求也越来越高&#xff0c;寻找一个稳定靠谱的供应商也成了很多学员所在公司的需求。对此…

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现SSA-TCN-BiGRU-Attention麻雀算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

树莓派夜视摄像头拍摄红外LED灯

NoIR相机是一种特殊类型的红外摄像头&#xff0c;其名称来源于"No Infrared"的缩写。与普通的彩色摄像头不同&#xff0c;NoIR相机具备红外摄影和低光条件下摄影的能力。 一般摄像头能够感知可见光&#xff0c;并用于普通摄影和视频拍摄。而NoIR相机则在设计上去除了…

基于python+vue共享单车信息系统的设计与实现flask-django-php-nodejs

课题主要分为二大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括&#xff1a;用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等&#xff1b;快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省…