SpringMVC Day 11 : 零 xml 配置

前言

欢迎来到《Spring MVC Day 11: 零XML配置》!在之前的学习中,我们已经掌握了如何使用Spring MVC框架构建灵活、高效的Web应用程序。然而,我们可能还记得那些繁琐的XML配置文件,它们是我们在过去几天中使用的方式。

好消息是,今天我们将告别这种繁琐的XML配置文件!在本文中,我们将介绍如何在Spring MVC中实现零XML配置,通过使用全注解和Java配置类来代替传统的XML配置文件。这将使我们的代码更加简洁、可读性更强,并且更加符合现代化的开发模式。

我们将逐步学习如何使用注解来替代XML配置文件的各个方面,包括控制器、请求映射、视图解析器等。通过这种新的方式,你会发现编写和维护Spring MVC应用程序将变得更加轻松和高效。

一、前期准备

1、新建项目,结构如下

2、导入依赖
    <dependencies><!-- springmvc 依赖,会将spring的核心包一并添加进来 --><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.5</version></dependency><!-- 集成 hibernata bean 验证器 --><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.13.Final</version></dependency><!-- 上传组件 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency></dependencies>
3、在 resources 包下新建一个 message.properties 
user.username = 请输入用户名
user.password = 请输入密码

 用于表单验证,非空判断的信息。

4、新建一个 User 类
@Data
public class User {@NotEmpty(message = "{user.userName}")private String userName;@NotEmpty(message = "{user.password}")private String password;}

该类使用了@Data注解,这个注解是Lombok库中的一个注解,它自动为类生成了一些通用的方法,如equals()hashCode()toString()等。

此外,User类中还有两个成员变量userNamepassword,它们都使用了@NotEmpty注解。@NotEmpty注解是Hibernate Validator库中的一个注解,用于验证字符串不能为空。在这个例子中,如果userNamepassword为空,将会抛出一个包含特定错误消息的异常。

总体而言,这段代码定义了一个简单的用户类,在进行数据校验时,要求用户名和密码均不能为空。通过使用@Data@NotEmpty注解,我们可以简化代码,并且在需要验证用户输入时提供了方便的方式。

5、编写一个登录拦截器 LoginInterceptor

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("执行拦截器的 preHandle 方法");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("执行拦截器的 postHandle 方法");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("执行拦截器的 afterCompletion 方法");}}

在拦截器的postHandle方法中,通过重写postHandle方法,你可以在请求处理之后、渲染视图之前执行一些操作。在这个例子中,拦截器又打印了一条日志信息,表示正在执行postHandle方法。

在拦截器的afterCompletion方法中,通过重写afterCompletion方法,你可以在请求完成之后执行一些操作。在这个例子中,拦截器同样打印了一条日志信息,表示正在执行afterCompletion方法。

需要注意的是,拦截器需要注册到Spring MVC的配置中才能生效。你可以通过配置WebMvcConfigurer或者使用@Configuration注解的配置类来注册拦截器。

在实际应用中,你可以根据具体需求在拦截器的各个方法中编写自己的业务逻辑,例如登录验证、权限控制等。拦截器是一种强大的工具,可以用于在请求处理过程中进行预处理和后处理操作。

6、编写一个 Controler 
@RestController
public class UserController {@PostMapping("/add")public Integer add(@Valid User user){return HttpStatus.OK.value();}}

 在方法上,使用了@PostMapping("/add")注解来指定对应的请求路径和请求类型。同时,你还使用了@Valid注解,表示需要对User对象进行数据校验。

如果User对象中的userNamepassword为空,将会抛出包含特定错误消息的异常。如果数据校验成功,add方法将返回HTTP状态码200,表示请求处理成功。

 二、创建 MvcConfig、WebConfig 配置类

1、MvcConfig 配置类
1)静态资源处理,方式一
// 声明为配置类
@Configuration
// 启用包扫描
@ComponentScan(basePackages = "edu.nf.ch11")
// 启用 mvc 注解驱动(等效于<mvc:annotation-driven/>)
@EnableWebMvc
// 实现 WebMvcConfigurer 接口用于覆盖默认的配置
public class MvcConfig implements WebMvcConfigurer {/***  配置类支持依赖注入,配置类也是容器管理的*/
//    @Autowired
//    private LoginInterceptor loginInterceptor;/*** 静态资源处理方式一:使用容器默认的 servlet 来处理* 注意:重写 WebMvcConfig 接口方法时不需要使用 @Bean*      注解来装配*/@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {// enable() 方法表示启用容器默认 servlet 处理静态资源configurer.enable();}
}

这段代码是Spring MVC的配置类,具体功能和作用如下:

  1. @Configuration注解表示这是一个配置类,会被Spring容器扫描并进行管理。

  2. @ComponentScan注解启用包扫描,指定要扫描的基础包路径为"edu.nf.ch11"。这个注解让Spring自动扫描并注入带有特定注解的组件,使得它们能够被容器管理。

  3. @EnableWebMvc注解启用MVC注解驱动,相当于XML配置文件中的<mvc:annotation-driven/>标签。这个注解会自动注册一些默认的组件,例如处理器映射、参数解析器和视图解析器等,以支持使用注解来简化开发。

  4. 实现WebMvcConfigurer接口用于覆盖默认的配置。通过实现这个接口,可以对Spring MVC的配置进行个性化定制。

  5. configureDefaultServletHandling方法重写了WebMvcConfigurer接口的方法,通过调用configurer.enable()启用容器默认的servlet来处理静态资源。这样,不需要再额外配置静态资源的处理,容器会自动处理静态资源的访问请求。

  6. 注释掉了@Autowiredprivate LoginInterceptor loginInterceptor部分代码。这部分代码可能是用于注入并配置一个登录拦截器,但在这个配置类中被注释掉了,可能是因为其他原因。

总之,这段代码是Spring MVC的配置类,用于配置和定制Spring MVC的行为和功能,包括启用包扫描、启用MVC注解驱动以及处理静态资源等。可以根据具体需求进行个性化配置和定制。

 2)静态资源处理,方式二
    /*** 静态资源处理方式二:由 springmvc 处理静态资源* 页面上以 page 开头的页面都放到 static 管理* @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/page/**").addResourceLocations("/static/");}

具体功能和作用如下:

  1. 创建一个ResourceHandlerRegistry对象实例,该类是Spring MVC提供的静态资源处理注册器,用于注册和配置静态资源的处理方式。

  2. 使用.addResourceHandler("/page/**")设置映射的URL路径模式,即当请求路径符合/page/**的格式时,将会被映射到静态资源处理器进行处理。

  3. 使用.addResourceLocations("/static/")设置静态资源的存放位置,即指定静态资源文件所在的目录。在这个例子中,将会把以/page/开头的请求映射到/static/目录下的对应静态资源文件。

通过这种方式,可以方便地处理和管理静态资源,使得在页面上以/page/开头的请求能够正常访问对应的静态资源文件。

 

3)装配 Bean 验证器
 /*** 装配 Bean 验证器*/@Overridepublic Validator getValidator() {LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();// 使用 Hibernate 框架提供的 Bean 验证器factoryBean.setProviderClass(HibernateValidator.class);// 指定资源文件ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:message");messageSource.setDefaultEncoding("UTF-8");// 装配给 factoryBeanfactoryBean.setValidationMessageSource(messageSource);return factoryBean;}

 具体功能和作用如下:

  1. 创建一个LocalValidatorFactoryBean实例,该类是Spring提供的验证器工厂类,用于创建验证器对象。

  2. 使用factoryBean.setProviderClass(HibernateValidator.class)设置验证器的提供者为Hibernate Validator。Hibernate Validator是一个基于Hibernate框架的验证器实现,提供了丰富的验证规则和错误消息。

  3. 创建一个ReloadableResourceBundleMessageSource实例,用于指定验证器的错误消息资源文件。setBasename("classpath:message")指定了资源文件的路径为"classpath:message",即在classpath下的message.properties文件中查找错误消息。

  4. 使用setDefaultEncoding("UTF-8")设置资源文件的编码格式为UTF-8,确保正确读取错误消息中的中文字符。

  5. 将上述创建的messageSource对象通过factoryBean.setValidationMessageSource(messageSource)方法装配给factoryBean,将资源文件配置到验证器中。

  6. 最后返回factoryBean,即返回了一个已经配置好的Hibernate Validator作为Bean验证器。

通过这种方式,可以使用Hibernate Validator作为验证器,并配置自定义的错误消息资源文件,从而实现对请求参数进行校验,并返回相应的错误信息。

4) 装配 commons-upload 上传解析器
  /*** 装配 commons-upload 上传解析器*/@Beanpublic CommonsMultipartResolver multipartResolver(){CommonsMultipartResolver resolver = new CommonsMultipartResolver();// 设置文件上传的大小resolver.setMaxUploadSize(104857600);// 设置编码resolver.setDefaultEncoding("UTF-8");return resolver;}

具体功能和作用如下:

  1. 创建一个CommonsMultipartResolver对象实例,该类是Spring提供的文件上传解析器,用于解析客户端传来的Multipart请求,即包含文件流的请求。

  2. 使用setMaxUploadSize(104857600)设置最大上传文件的大小,单位为字节。在这个例子中,最大允许上传100MB的文件。

  3. 使用setDefaultEncoding("UTF-8")设置编码格式为UTF-8,确保正确解析文件名和文件内容中的中文字符。

  4. 将创建好的resolver对象返回,作为配置好的上传解析器Bean。

通过这种方式,可以方便地配置和管理文件上传解析器,以便处理文件上传相关的请求。

5)装配拦截器
/*** 装配拦截器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/login.html","/static/js/**","/static/css/**","/login");}

 具体功能和作用如下:

  1. 创建一个InterceptorRegistry对象实例,该类是Spring提供的拦截器注册器,用于注册拦截器。

  2. 使用registry.addInterceptor(new LoginInterceptor())将自定义的LoginInterceptor拦截器添加到拦截器注册器中。

  3. 使用.addPathPatterns("/**")设置需要拦截的请求路径,即所有请求都需要被该拦截器拦截。

  4. 使用.excludePathPatterns()设置不需要拦截的请求路径,即在该拦截器之外的请求,这里排除了静态资源文件和登录页面等请求。

  5. 最后的效果是,当有请求时,会先进入LoginInterceptor拦截器,进行判断是否已经登录。如果未登录,则将请求转发到登录页面进行登录;如果已经登录,则放行请求继续处理。

通过这种方式,可以方便地配置和管理拦截器,以便对请求进行统一处理和验证。

6)跨域配置
/*** 跨域配置*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowedHeaders("*").exposedHeaders("*");// 跨域时时候允许传递 cookie,默认是不允许的//.allowCredentials(true);}

具体功能和作用如下:

  1. 创建一个CorsRegistry对象实例,该类是Spring提供的跨域配置注册器,用于注册跨域请求的配置。

  2. 使用.addMapping("/**")设置需要进行跨域配置的请求路径模式,这里使用通配符/**表示所有请求都需要跨域配置。

  3. 使用.allowedOrigins("*")设置允许的来源,即允许跨域请求的来源域名。在这个例子中,使用通配符*表示允许任何域名发起跨域请求。

  4. 使用.allowedMethods("*")设置允许的HTTP方法,即允许跨域请求的HTTP方法。在这个例子中,使用通配符*表示允许任何HTTP方法。

  5. 使用.allowedHeaders("*")设置允许的请求头,即允许跨域请求携带的请求头。在这个例子中,使用通配符*表示允许任何请求头。

  6. 使用.exposedHeaders("*")设置允许暴露的响应头,即允许跨域请求返回的响应头信息。在这个例子中,使用通配符*表示允许任何响应头。

  7. 可选的,使用.allowCredentials(true)设置是否允许跨域请求携带cookie。默认情况下,浏览器在跨域请求中是不会发送cookie的,需要显示地设置为true才能够携带cookie。

通过这种方式,可以方便地配置和管理跨域请求的相关参数,以便应对跨域请求场景。

 7)配置内部资源解析器
 /*** 配置内部资源视图解析器*/@Beanpublic InternalResourceViewResolver viewResolver(){InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEN-INF/jsp/");viewResolver.setSuffix(".jsp");return viewResolver;}

具体功能和作用如下:

  1. 使用@Bean注解将该方法声明为一个Spring Bean。

  2. 创建一个InternalResourceViewResolver对象实例,该类是Spring MVC提供的视图解析器,用于解析JSP视图。

  3. 使用.setPrefix("/WEN-INF/jsp/")设置JSP文件所在的目录路径,即指定模板文件的存放位置。在这个例子中,将会在/WEB-INF/jsp/目录下查找JSP文件。

  4. 使用.setSuffix(".jsp")设置JSP文件的后缀名,即指定JSP文件的文件类型。在这个例子中,将会查找后缀名为.jsp的文件。

  5. 返回InternalResourceViewResolver对象实例。

通过这种方式,可以方便地进行JSP视图解析,使得在控制器中返回的逻辑视图名能够正确解析对应的JSP视图文件。

2、配置 WebConfig
/*** @Date 2023-10-30* @Author qiu* webConfig 配置类,用于取代 web.xml* 在继承的父类中已经帮我们创建了 dispatcherServlet 并初始化* 只需要在重写的 getServletMappings 方法中指定映射的地址即可* 相当于 web.xml  中的 <url-pattern>/</url-pattern>*/
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 加载主配置类* @return*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}/*** 加载 MVC 的配置类* @return*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{MvcConfig.class};}/*** 给 dispatcherServlet 配置 url-pattern* @return*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}}

 具体作用和功能如下:

  1. 继承自AbstractAnnotationConfigDispatcherServletInitializer,这是Spring提供的一个抽象类,用于帮助我们进行基于注解的Spring MVC配置。

  2. 重写getRootConfigClasses()方法,用于加载主配置类。在这个例子中,返回一个空数组,表示没有额外的根配置类需要加载。

  3. 重写getServletConfigClasses()方法,用于加载MVC的配置类。在这个例子中,返回一个包含MvcConfig类的数组,表示加载MvcConfig类作为MVC的配置类。

  4. 重写getServletMappings()方法,用于给dispatcherServlet配置URL映射。在这个例子中,返回一个包含"/"的字符串数组,表示将所有请求都映射到dispatcherServlet上。

通过这种方式,可以在Java代码中灵活配置Spring MVC,取代传统的使用web.xml进行配置的方式。这样可以更方便地管理和维护项目的配置,并且提高了代码的可读性和可维护性。

三、使用配置类配置 springMvc 有什么好处 

使用配置类来配置Spring MVC有以下好处:

  1. 基于JavaConfig,无需XML:使用配置类可以完全基于Java代码来完成Spring MVC的配置,不再需要使用XML文件来进行配置。

  2. 可以使用更加面向对象的方式:通过配置类,可以使用更加面向对象的方式来进行配置,而不是XML中的标签式配置,这样更加符合Java开发者的习惯和编码风格。

  3. 代码结构清晰:使用配置类可以将不同功能的配置分离到不同的类中,使得代码结构更加清晰,易于维护和扩展。

  4. 更加灵活:使用配置类可以方便地实现条件化配置、根据环境变量或系统属性动态调整配置等功能,从而让配置更加灵活。

  5. 与其他Spring特性集成:使用配置类可以方便地与其他Spring特性如Spring Boot、Actuator、Security等集成,从而让整个应用程序更加协调和一致。

总之,使用配置类配置Spring MVC可以提高代码的可读性、可维护性和可扩展性,并且可以更好地与其他Spring特性集成,是目前推荐的一种配置方式。

四、gitee 案例

地址:ch11 · qiuqiu/SpringMVC - 码云 - 开源中国 (gitee.com)

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

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

相关文章

Stable Diffusion 的提示词使用技巧

推荐Stable Diffusion自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 什么是提示语&#xff1f; 提示语是人工智能中的一个重要组成部分&#xff0c;尤其是自然语言处理 &#xff08;NLP&#xff09;。在AI自人工智能中&#xff0c;想要获得好的效果&#xff0c;简…

JavaScript执行上下文和调用栈

上节课我们已经说过了&#xff0c;JavaScript的代码执行是发生在js引擎中的调用堆栈的&#xff0c;但是具体是如何运行的&#xff0c;我们来详细剖析一下 如何执行上下文 执行上下文&#xff1a; 执行上下文是指在JavaScript中代码被执行时所创建的环境。它包含了变量、函数、…

uni-app学习笔记

目录 一、前期准备 1、项目认识 2、pages.json基本配置 3、创建页面 二、tabBar 1、获取图标 2、代码配置 三、基础认识 1、页面生命周期 2、App.vue应用生命周期 四、基础组件 1、scroll-view可滚动视图区域 2、提示框 3、swiper滑块视图容器 4、form表单组件 一…

【漏洞复现】Apache_HTTP_2.4.49_路径穿越漏洞(CVE-2021-41773)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞验证方式一 curl方式二 bp抓包 说明内容漏洞编号CVE-2021-41773漏洞名称Apache HTTP 路径穿越漏洞漏…

新手入门Python一定要看的八个超实用建议!

文章目录 前言一、项目文件事先做好归档二、永远不要手动修改源数据并且做好备份三、做好路径的正确配置四、代码必要的地方做好备注与说明五、加速你的Python循环代码六、可视化你的循环代码进度七、使用高效的异常捕获工具八、要多考虑代码健壮性关于Python技术储备一、Pytho…

[PyTorch][chapter 61][强化学习-免模型学习1]

前言&#xff1a; 在现实的学习任务中&#xff0c;环境 其中的转移概率P,奖赏函数R 是未知的&#xff0c;或者状态X也是未知的 称为免模型学习&#xff08;model-free learning&#xff09; 目录&#xff1a; 1: 蒙特卡洛强化学习 2&#xff1a;同策略-蒙特卡洛强化学习 3&am…

手写数字识别--神经网络实验

实验源码自取&#xff1a; 我自己搞的代码&#xff0c;预测精度才94% 神经网络实验报告源码.zip - 蓝奏云 老师给的实验源码答案和资料&#xff0c;预测精度高达99% 深度学习实验报告.zip - 蓝奏云 上深度学习的课程&#xff0c;老师布置了一个经典的实验报告&#xff0c;我做…

libpcap之数据分流

当前系统都是多核系统&#xff0c;为了充分利用多核优势&#xff0c;数据包可以在底层就进行分流&#xff0c;可以通过多线程/多进程对同一个接口的数据进行并行的处理。 一、实验 一个server/client程序一个简单的抓包程序&#xff0c;抓取server/client之间的通信数据 1.1 …

【蓝桥杯 第十四届省赛Java B组】真题训练(A - C)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - A、阶乘求和 - BigInteger 思路&#xff1a; 当时比赛时&#xff0c;拿计算器算的&#xff0c;然后辛辛苦苦也没对 看到这个数肯定很大&#xff0c;而且只求后9位&#xff0c;阶乘越…

【计算机网络】应用层

应用层协议原理 客户-服务器体系结构&#xff1a; 特点&#xff1a;客户之间不能直接通信&#xff1b;服务器具有周知的&#xff0c;固定的地址&#xff0c;该地址称为IP地址。 配备大量主机的数据中心常被用于创建强大的虚拟服务器&#xff1b;P2P体系结构&#xff1a; 特点&…

K8S知识点(二)

&#xff08;1&#xff09;K8S概念 K8S是通过控制pod来控制容器进而控制程序的 service是沟通Pod和外键的桥梁&#xff0c;可以实现负载均衡的效果&#xff0c;加权负载的效果 &#xff08;2&#xff09;环境搭建-环境规划 &#xff08;3&#xff09;环境搭建-主机安装 使用…

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PSO-VMD粒子群算法PSO优化VMD变分模态分解 可直接运行 分解效果…

2023-11-04 LeetCode每日一题(数组中两个数的最大异或值)

2023-11-04每日一题 一、题目编号 421. 数组中两个数的最大异或值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 1&#xff1a; 示例 2&…

[动态规划] (六) 路径问题 LeetCode 63.不同路径II

[动态规划] (六) 路径问题: LeetCode 63.不同路径II 文章目录 [动态规划] (六) 路径问题: LeetCode 63.不同路径II题目解析解题思路状态表示状态转移方程初始化和填表返回值 代码实现总结 63. 不同路径 II 题目解析 (1) 机器人从左上角移动到右下角 (2) 机器人只能向右或者向…

【漏洞复现】Nginx_0.7.65_空字节漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.1、漏洞描述 1.2、漏洞等级 1.3、影响版本 0.7.65 1.4、漏洞复现 1、基础环…

JavaSpringbootMySQL高校实训管理平台01557-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 高校实训管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

Oracle安全基线检查

一、账户安全 1、禁止SYSDBA用户远程连接 用户具备数据库超级管理员(SYSDBA)权限的用户远程管理登录SYSDBA用户只能本地登录,不能远程。REMOTE_LOGIN_PASSWORDFILE函数的Value值为NONE。这意味着禁止共享口令文件,只能通过操作系统认证登录Oracle数据库。 1)检查REMOTE…

【python 深拷贝与浅拷贝】

python 深拷贝与浅拷贝 问题&#xff1a; 在用影刀编写流程的时候发现&#xff0c;明明只修改人名为“小张”对应的字典里面的值&#xff0c;但是所有的人名对应的值都被修改了。 原因&#xff1a; 第14行&#xff0c;设置键值对&#xff0c;值对应的变量“初始打卡类型字…

伪随机序列——m序列及MATLAB仿真

文章目录 前言一、m 序列1、m 序列的产生2、m 序列的性质①、均衡性②、游程分布③、移位相加特性④、自相关函数⑤、功率谱密度⑥、伪噪声特性 二、M 序列1、m 序列的产生2、m 序列的性质 三、MATLAB 中 m 序列1、m 序列生成函数的 MATLAB 代码2、MATLAB 仿真 前言 在通信系统…