【Spring Security】打造安全无忧的Web应用--入门篇
🥳🥳Welcome Huihui's Code World ! !🥳🥳
接下来看看由辉辉所写的关于Spring Security的相关操作吧
目录
🥳🥳Welcome Huihui's Code World ! !🥳🥳
一.Spring Security是什么
1.概念
2.工作原理
二.为什么要用Spring Security
三.Spring Security怎么使用
0.创建项目
1.导入依赖
2.yml配置
3.获取security默认密码
4.Web安全配置类
5.controller
6.总体说明
①配置多用户角色访问
②配置相关页面及请求路径
③配置自定义登录
④配置安全退出
⑤配置自定义异常处理器
四.Spring Security中的常用方法
HttpSecurity介绍
一.Spring Security是什么
1.概念
`Spring Security`是一个基于`Spring`框架的安全性框架,可用于对Java应用程序进行身份验证、授权和其他安全性功能的添加。它不仅可以对Web应用程序进行保护,还可以保护非Web环境下的应用程序,如远程服务和命令行应用程序等。`Spring Security`提供了一系列可插拔的安全性特性,如基于标记的身份验证、权限控制、单点登录、密码加密等。它还支持多种安全性协议和标准,如`OAuth`、`SAML`、`OpenID`等,可与各种身份提供商集成。
2.工作原理
权限框架一般包含两大核心模块:认证(Authentication)和鉴权(Authorization)。
认证:认证模块负责验证用户身份的合法性,生成认证令牌,并保存到服务端会话中(如TLS)。
鉴权:鉴权模块负责从服务端会话内获取用户身份信息,与访问的资源进行权限比对。
核心组件介绍:
AuthenticationManager
:管理身份验证,可以从多种身份验证方案中选择一种。
Authentication
:用于验证用户的身份。
SecurityContextHolder
:用于管理SecurityContext
的ThreadLocal
,以便在整个请求上下文中进行访问,方便用户访问。
AccessDecisionManager
:负责对访问受保护的资源的请求进行决策(即决定是否允许用户访问资源)
AccessDecisionVoter
:是AccessDecisionManager的实现组件之一,它用于对用户请求的访问受保护的资源所需要的角色或权限进行投票。
ConfigAttribute
:用于表示受保护资源或URL需要的访问权限,它可以理解为是访问控制策略的一部分
二.为什么要用Spring Security
SpringBoot 没有发布之前,Shiro 应用更加广泛,因为 Shiro 是一个强大且易用的 Java 安全框架,能够非常清晰的处理身份验证、授权、管理会话以及密码加密。利用其易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。但是 Shiro 只是一个框架而已,其中的内容需要自己的去构建,前后是自己的,中间是Shiro帮我们去搭建和配置好的。
SpringBoot
发布后,随着其快速发展,Spring Security
(前身叫做Acegi Security
) 重新进入人们的视野。SpringBoot
解决了Spring Security
各种复杂的配置,Spring Security
在我们进行用户认证以及授予权限的时候,通过各种各样的拦截器来控制权限的访问,从而实现安全,也就是说Spring Security
除了不能脱离Spring
,Shiro
的功能它都有。
在用户认证方面,
Spring Security
框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID
和LDAP
等。在用户授权方面,
Spring Security
提供了基于角色的访问控制和访问控制列表(Access Control List,ACL
),可以对应用中的领域对象进行细粒度的控制。
Shiro
在这个环境下实际已经不具备优势了。因为Spring这个生态链现在是太强大了。总之就是,我们使用这个框架是用来帮助我们提高系统的安全性能的,假设我们没用这个框架来做安全认证,那么我们就需要手动编写很多的代码去完成权限的功能
三.Spring Security怎么使用
0.创建项目
这里依赖可以先选这三个,后面再pom中也可以自行添加(free marker等)
1.导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency><!-- freemarker --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!-- web --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- lombok --> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>
spring-boot-starter-security
包含了以下几个主要的依赖:
spring-security-core:
Spring Security
的核心模块,提供了基于权限的访问控制以及其他安全相关功能。spring-security-config:提供了
Spring Security
的配置实现,例如通过Java配置创建安全策略和配置Token存储等。spring-security-web:提供了
Spring Security Web
的基本功能,例如Servlet
集成和通过HttpSecurity
配置应用程序安全策略。2.yml配置
spring:freemarker:# 设置freemarker模板后缀suffix: .ftl# 设置freemarker模板前缀template-loader-path: classpath:/templates/enabled: true server:port: 8080
3.获取security默认密码
也可以自己在yml中先配置密码(因为今天使用模拟代码,没有连接数据库)
自己设置初始的默认的密码
spring:security:user:name: 自定义用户名password: 自定义密码
4.Web安全配置类
package com.wh.security.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain;@Configuration @EnableWebSecurity public class WebSecurityConfig {@Beanpublic PasswordEncoder bcryptPasswordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic UserDetailsService userDetailsService() {//设置账户--admin--以及这个账户的角色UserDetails admin = User.withUsername("admin").password(bcryptPasswordEncoder().encode("1234")).roles("ADMIN", "USER").build();//设置账户--user--以及这个账户的角色UserDetails user = User.withUsername("user").password(bcryptPasswordEncoder().encode("1234")).roles("USER").build();return new InMemoryUserDetailsManager(admin, user);}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {//配置需要处理的urlhttp.authorizeRequests()//antMatchers指可以配置多个url permitAll使用这个方法代表其中的url都不需要进行认证.antMatchers("/toLogin").permitAll()//antMatchers指可以配置多个url hasRolel使用这个方法代表其中的url需要是这个角色才可以访问.antMatchers("/admin/**").hasRole("ADMIN")//antMatchers指可以配置多个url hasAnyRole使用这个方法代表其中的url只有指定了的那些角色才能访问.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")//匹配任意`url`,其他的都需要认证.anyRequest().authenticated()//and表示后面继续追加条件.and()//**登录formLogin**的相关设置.formLogin()//登录进入的界面.loginPage("/toLogin")//设置登录请求的 URL,即表单提交的 URL.loginProcessingUrl("/userLogin").successForwardUrl("/successLogin")//登录所需要传递的参数.usernameParameter("username").passwordParameter("password")//and表示后面继续追加条件.and()//退出登录的相关配置.logout()//退出登录的url地址.logoutUrl("/logout")//成功退出登录之后进入的界面.logoutSuccessUrl("/");http.csrf().disable();//处理异常的界面(没有权限的时候所看到的界面)http.exceptionHandling().accessDeniedPage("/noAccess");return http.build();}}
5.controller
package com.wh.security.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;@Controller public class UserController {@RequestMapping("/successLogin")public String successLogin() {return "default";}@RequestMapping("/toLogin")public String toLogin() {return "login";}@RequestMapping("/userLogin")public String userLogin(String username, String password) {System.out.println("username=" + username + ",password=" + password);return "default";}@RequestMapping("/admin/toAddUser")public String toAddUser() {return "admin/addUser";}@RequestMapping("/admin/toListUser")public String toListUser() {return "admin/listUser";}@RequestMapping("/admin/toResetPwd")public String toResetPwd() {return "admin/resetPwd";}@RequestMapping("/admin/toUpdateUser")public String toUpdateUser() {return "admin/updateUser";}@RequestMapping("/user/toUpdatePwd")public String toUpdatePwd() {return "user/updatePwd";}@RequestMapping("/noAccess")public String noAccess() {return "accessDenied";}}
6.总体说明
在我们没有使用web安全配置类之前,主要登录进去了,便可以访问所有的界面,但是当我们在安全配置类中配置了多用户角色访问之后,就只可以使用其中配置的用户(类比于数据库中的用户)进行登录了,我们还需要在其中配置相关页面及请求路径(登录的界面,登录的表单提交界面路径,登录成功之后进入的界面路径...),以及配置很重要的自定义异常处理器,配置了之后,当用户是没有权限去访问此页面时,就不会是纯粹的报错403等信息了,而是一个我们自定义的提示界面
①配置多用户角色访问
@Beanpublic UserDetailsService userDetailsService() {//设置账户--admin--以及这个账户的角色UserDetails admin = User.withUsername("admin").password(bcryptPasswordEncoder().encode("1234")).roles("ADMIN", "USER").build();//设置账户--user--以及这个账户的角色UserDetails user = User.withUsername("user").password(bcryptPasswordEncoder().encode("1234")).roles("USER").build();return new InMemoryUserDetailsManager(admin, user);}
接下来的操作都需要在创建的SecurityConfig配置类中完成(规范)
②配置相关页面及请求路径
其中有不需要进行认证的页面,比如说登录,那么我们就可以在其中进行配置。还有一些界面是需要特定的身份才可以访问的界面
//配置需要处理的urlhttp.authorizeRequests()//antMatchers指可以配置多个url permitAll使用这个方法代表其中的url都不需要进行认证.antMatchers("/toLogin").permitAll()//antMatchers指可以配置多个url hasRolel使用这个方法代表其中的url需要是这个角色才可以访问.antMatchers("/admin/**").hasRole("ADMIN")//antMatchers指可以配置多个url hasAnyRole使用这个方法代表其中的url只有指定了的那些角色才能访问.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")//匹配任意`url`,其他的都需要认证.anyRequest().authenticated()
③配置自定义登录
.and()//**登录formLogin**的相关设置.formLogin()//登录进入的界面.loginPage("/toLogin")//设置登录请求的 URL,即表单提交的 URL.loginProcessingUrl("/userLogin").successForwardUrl("/successLogin")//登录所需要传递的参数.usernameParameter("username").passwordParameter("password")
默认的登录界面
④配置安全退出
//and表示后面继续追加条件.and()//退出登录的相关配置.logout()//退出登录的url地址.logoutUrl("/logout")//成功退出登录之后进入的界面.logoutSuccessUrl("/");
⑤配置自定义异常处理器
//处理异常的界面(没有权限的时候所看到的界面)http.exceptionHandling().accessDeniedPage("/noAccess");
四.Spring Security中的常用方法
HttpSecurity介绍
HttpSecurity
是Spring Security
的一个核心类,用于配置应用程序的安全策略。
HttpSecurity
类通常包含许多方法,可以用于配置以下内容:
HTTP 请求的安全策略,例如访问控制、跨站点请求伪造 (CSRF) 防护等。
HTTP 验证的安全策略,例如基于表单、HTTP 基本身份验证、OAuth 等。
访问受保护资源时所需的身份验证和授权方式。
方法 说明 authorizeRequests()
用于配置如何处理请求的授权,默认情况下所有的请求都需要进行认证和授权才能访问受保护的资源 formLogin()
用于配置基于表单的身份验证,包括自定义登录页面、登录请求路径、用户名和密码的参数名称、登录成功和失败的跳转等。 httpBasic()
用于配置基于 HTTP Basic
身份验证,包括定义使用的用户名和密码、realm
名称等。logout()
用于配置退出登录功能,包括定义退出登录请求的URL、注销成功后的跳转URL、清除会话、删除 Remember-Me
令牌等。csrf()
用于配置跨站请求伪造保护,包括定义 CSRF Token
的名称、保存方式、忽略某些请求等。sessionManagement()
用于配置会话管理,包括定义并发控制、会话失效、禁用URL重定向、会话固定保护等。 rememberMe()
用于配置 Remember-Me
功能,包括定义Remember-Me
令牌的名称、有效期、加密方法、登录成功后的处理方式等。exceptionHandling()
用于配置自定义的异常处理,包括定义异常处理器和异常处理页面等。 headers()
用于配置HTTP响应头信息,包括定义 X-Content-Type-Options、X-XSS-Protection、Strict-Transport-Security
等头信息。cors()
用于配置跨域资源共享,包括定义可访问的来源、 Headers
等。addFilter()
用于向当前 HttpSecurity
中添加自定义的Filter
。and()
用于在配置中添加另一个安全规则,并将两个规则合并。 匹配规则:
URL匹配
方法 说明 requestMatchers()
配置一个 request Mather
数组,参数为RequestMatcher
对象,其match
规则自定义,需要的时候放在最前面,对需要匹配的的规则进行自定义与过滤authorizeRequests()
URL权限配置 antMatchers()
配置一个 request Mather
的string
数组,参数为ant
路径格式, 直接匹配url
anyRequest()
匹配任意 url
,无参 ,最好放在最后面
保护URL
方法 说明 authenticated()
保护 Url
,需要用户登录permitAll()
指定URL无需保护,一般应用与静态资源文件 hasRole(String role)
限制单个角色访问 hasAnyRole(String… roles)
允许多个角色访问 access(String attribute)
该方法使用 SPEL
, 所以可以创建复杂的限制hasIpAddress(String ipaddressExpression)
限制 IP
地址或子网
登录formLogin
方法 说明 loginPage()
设置登录页面的 URL defaultSuccessUrl()
设置登录成功后的默认跳转页面 failuerHandler()
登录失败之后的处理器 successHandler()
登录成功之后的处理器 failuerUrl()
登录失败之后系统转向的 url
,默认是this.loginPage + “?error”
loginProcessingUrl()
设置登录请求的 URL,即表单提交的 URL usernameParameter()
设置登录表单中用户名字段的参数名,默认为 username
passwordParameter()
设置登录表单中密码字段的参数名,默认为 password
登出logout
方法 说明 logoutUrl()
登出 url
, 默认是/logout
llogoutSuccessUrl()
登出成功后跳转的 url
默认是/login?logout
logoutSuccessHandler()
登出成功处理器,设置后会把 logoutSuccessUrl
置为null
好啦,今天的分享就到这了,希望能够帮到你呢!😊😊
相关文章:
【Spring Security】打造安全无忧的Web应用--入门篇
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Spring Security是什么 1.概…...
【每日一题】【12.20】2828.判别首字母缩略词
🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.题目链接 2828. 判别首字母缩略词https://leetcode.cn/problems/check-if-a-string-is-an-acronym-of-words/ 2.题目描述 今天…...
LabVIEW开发振动数据分析系统
LabVIEW开发振动数据分析系统 自动测试系统基于LabVIEW平台设计,采用了多种高级硬件设备。系统的硬件组成包括PCB振动加速度传感器,这是一种集成了传统压电加速度传感器和电荷放大器的先进设备,能够直接与采集仪器连接。此外,系统…...
去掉乘法运算的加法移位神经网络架构
[CVPR 2020] AdderNet: Do We Really Need Multiplications in Deep Learning? 代码:https://github.com/huawei-noah/AdderNet/tree/master 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能,提出全精度梯度…...
【TB作品】51单片机,具有报时报温功能的电子钟
2.具有报时报温功能的电子钟 一、功能要求: 1.显示室温。 2.具有实时时间显示。 3.具有实时年月日显示和校对功能。 4.具有整点语音播报时间和温度功能。 5.定闹功能,闹钟音乐可选。 6.操作简单、界面友好。 二、设计建议: 1.单片机自选(C51、STM32或其他单片机)。 2.时钟日历芯…...
了解C++工作机制
基于hello.cpp对C的运行进行一个初步认识,并介绍国外C大佬Cherno常用的项目结构和调试Tips C是如何工作的 C工作流程1.实用工程(project)结构(1)Microsoft Visual Studio2022新建项目后,自动生成的原始文件…...
力扣题目学习笔记(OC + Swift) 14. 最长公共前缀
14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 方法一 竖向扫描法 个人感觉纵向扫描方式比较直观,符合人类理解方式,从前往后遍历所有字符串的每一列,比较相同列上的…...
WinSW设置应用程序开机启动
前言 由于使用windows自动的自启方法,不管是将程序启动服务放到开机自启文件夹中,还是创建任务计划程序,都没有很好的实现程序的开机自启效果,而WinSW很好的解决了这个问题。 下载 WinSW下载地址 注意:不同版本&#…...
Leetcode—96.不同的二叉搜索树【中等】
2023每日刷题(六十四) Leetcode—96.不同的二叉搜索树 算法思想 实现代码 class Solution { public:int numTrees(int n) {vector<int> G(n 1, 0);G[0] 1;G[1] 1;for(int i 2; i < n; i) {for(int j 1; j < i; j) {G[i] G[j - 1] * …...
正则表达式零宽断言
正则表达式零宽断言 工具类,正则表达式匹配文本内容正则表达式语法例子例子01零宽断言?< 不包含左边值? 不包含右边值例子 常用正则表达式校验数字的表达式校验字符的表达式 工具类,正则表达式匹配文本内容 /*** 正则表达式工具类*/ public class…...
uni-app学习记录
uni-app注意点记录 跳转到 tabBar 页面只能使用 switchTab 跳转路由API的目标页面必须是在pages.json里注册的vue页面。如果想打开web url,在App平台可以使用 plus.runtime.openURL或web-view组件;H5平台使用 window.open;小程序平台使用web…...
API资源对象StorageClass;Ceph存储;搭建Ceph集群;k8s使用ceph
API资源对象StorageClass;Ceph存储;搭建Ceph集群;k8s使用ceph API资源对象StorageClass SC的主要作用在于,自动创建PV,从而实现PVC按需自动绑定PV。 下面我们通过创建一个基于NFS的SC来演示SC的作用。 要想使用NFS的SC,还需要安装一个NFS…...
Databend 开源周报第 124 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 新增对 Delta 和…...
Arduino开发实例-液体流量测量
液体流量测量 文章目录 液体流量测量1、流量传感器介绍2、硬件准备及接线3、代码实现在本文中,将介绍如何流量传感器进行测量液体流量。 流量传感器用于测量液体流速。 市场上有不同类型的流量传感器,在本文中,我们将使用霍尔效应流量传感器。 这些类型的流量传感器是非侵入…...
【idea】解决sprintboot项目创建遇到的问题
目录 一、报错Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found 二、报错java: 错误: 无效的源发行版:17 三、java: 无法访问org.springframework.web.bind.annotation.CrossOrigin 四、整合mybatis的时候,报java.lang.Ill…...
ADC芯片CS1237在电子秤方案的优势
随着科技的不断发展,电子秤已经成为我们日常生活中不可或缺的测量工具。为了满足用户对于高精度、高稳定性的需求,芯海ADC芯片CS1237应运而生,为电子秤方案带来了革命性的变革。 一、芯海ADC芯片CS1237介绍 芯海ADC芯片CS1237是一款高性能…...
Leetcode的AC指南 —— 哈希表:202. 快乐数
摘要: Leetcode的AC指南 —— 哈希表:202. 快乐数。题目介绍:编写一个算法来判断一个数 n 是不是快乐数。 文章目录 一、题目二、解析1、哈希表 一、题目 题目介绍:编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为…...
机器学习 项目结构 数据预测 实验报告
需求: 我经过处理得到了测试值,然后进一步得到预测和真实值的比较,然后再把之前的所有相关的参数、评估指标、预测值、比较结果都存入excel,另外我还打算做测试报告模板,包括敏感性分析等。您建议我这些功能如何封装这些功能&…...
[Verilog] 设计方法和设计流程
主页: 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法(top-down)。设计流程是指从一个项目开始从项目需求分析,架构设计,功能验证&#…...
C语言:指向数组的指针和指向数组元素的指针
相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆,或者笼统地被称为数组指针,但它们之间是有差别的,本文就将对此进行讨论。 下面的代码…...
SQL基础:SQL 介绍和数据库基础
SQL简介 常用的Java等语言是和计算机交流的工具,告诉计算机,让计算机做一些事。 和其类似,SQL是 Structured Query Language 的缩写,即结构化的查询语言,是和数据库交互的工具,即通过既定的一些格式&…...
SpringSecurity入门
前言 Spring Security是一个用于在Java应用程序中提供身份验证和授权功能的强大框架。它构建在Spring框架之上,为开发人员提供了一套灵活且全面的安全性服务,本篇将为大家带来Spring Security的详细介绍及入门 一.安全框架 在学习了解Spring Security之…...
iOS 应用在前台时显示通知
背景: 在iOS应用中,当应用在前台运行时,是不会默认弹出通知的。这是iOS的设计决定,以避免用户在使用应用的过程中被打扰。然而,如果你希望在应用在前台的时候也能收到通知,你可以在你的应用代码中进行一些…...
Hamming space
汉明距离表示两个相同长度字符串对应位置的不同字符的数量。 对两个字符串异或运算,并统计1的个数并相减,这个数就是汉明距离。...
anaconda 安装 使用 pytorch onnx onnxruntime
一:安装 如果不是 x86_64,需要去镜像看对应的版本 安装 Anaconda 输入命令 bash Anaconda3-2021.11-Linux-x86_64.sh 然后输入 yes 表示同意 确认安装的路径,一般直接回车安装在默认的 /home/你的名字/anaconda3 很快就安装完毕。输入 yes…...
Web请求与响应
目录 Postman Postman简介 Postman的使用 请求 简单参数 实体参数 数组参数 集合参数 日期参数 Json参数 路径参数 响应 ResponseBody 统一响应结果 Postman Postman简介 postman是一款功能强大的网页调试与发送网页http请求的Chrome插件,常用于进行…...
ADS学习笔记(一)——更新中
在ADS中,信号上升时间为信号从0~100%所用的时间,而实际上定义的上升边均为10%~90%,所以可以认为上升边=0.8*ADS设置上升时间。 一、终端开路及短路的反射信号 1.仿真条…...
智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.冠状病毒群体免疫算法4.…...
小型气象站是什么?
随着科技的发展,我们的生活变得越来越便捷。如今,一款名为小型气象站的新兴设备正在逐渐走进我们的生活,为我们的日常生活增添了更多的便利和舒适。 WX-CQ12小型气象站是一种集成了多种传感器和数据采集技术的智能设备,可以实时监…...
官方指定Jmeter配置JVM堆内存方式
1.概述 在使用Jmeter做性能测试过程中,可能会应为默认设置的堆内存值较小出现堆内存溢出问题,此时解决的方式有两种,分布式测试和调大堆内存。下面介绍官方推荐调整堆内存方法。 2.调整Jmeter堆内存 2.1.介绍官方推荐堆内存调整方法(jmete…...
wordpress相册样式/seo值是什么意思
Sublime Text3 常用快捷键必看 https://blog.csdn.net/md1688/article/details/53043525转载于:https://www.cnblogs.com/yanxiatingyu/p/9379644.html...
188网站开发/百度的营销策略
修改进程用户相关信息 int access (__const char *__name, int __type):检测当前进程是否拥有对某文件的访问权限 参数1:待访问文件 参数2:相应权限 4(R_OK 可读),2(W_OK 可写)&…...
iapp怎么把网站做软件/最新国际新闻热点事件
众所周知,Go 在做依赖管理时会创建两个文件,go.mod 和 go.sum。相比于 go.mod,关于 go.sum 的资料明显少得多。自然,go.mod 的重要性不言而喻,这个文件几乎提供了依赖版本的全部信息。而 go.sum 看上去就是 go module …...
python做网站好吗/搜索引擎优化有哪些要点
电脑能力主要看处理器和显卡。办公用途,平面设计类吃处理器的能力。游戏,3d设计类吃显卡能力。不管那种需求,内存容量都是需要有合理的选择(类如看机器是否支持扩展)。不管台式本子都一样。本子的能力和选择问题下面说法参考。~&a…...
ecs和wordpress/今日重点新闻
属于( A )A、过程控制 B、数据处理C、科学计算 D、CAD/CAM14、与十进制数0.625D等值的二进制数是( A )A、0.1010B B、0.1101B C、0.1111B D、0.1011B15、世界上最先实现的程序存储的计算机是( B )A、ENIAC B、EDSAC C、EDVAC D、UNIVAC16、性能价格比也是一种用来衡量计算机产品…...
武汉最好的网站建设公司哪家好/seo薪酬
引论 : 在面向对象的程序设计语言中,多态(polymorphic)是继数据抽象和继承之后的第三种基本特性。 多态通过分离“做什么”和“怎么做”,从另一角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性&…...