SpringSecurity入门
前言
Spring Security是一个用于在Java应用程序中提供身份验证和授权功能的强大框架。它构建在Spring框架之上,为开发人员提供了一套灵活且全面的安全性服务,本篇将为大家带来Spring Security的详细介绍及入门
一.安全框架
在学习了解Spring Security之前先了解什么是安全框架。安全框架顾名思义,就是解决系统安全问题的框架。任何应用开发的计划阶段都应该确定一组特定的安全需求,如身份验证、授权和加密方式。不使用安全框架之前,我们需要手动处理每个资源的访问控制,针对不同的项目都需要做不同的处理,此时就会显得非常麻烦,并且低效率引起的额外开销会延缓开发周期。使用安全框架,使开发团队能够选择最适合这些需求的框架,可以通过配置的方式实现对资源的访问限制,使得开发更加的高效。
二.主流安全框架
1.Spring Security:
Spring Security
是目前Java Web领域中最流行的框架之一,它提供了一系列安全级别,包括基于认证和授权的安全保护,以及各种各样的安全校验,使得开发人员可以非常容易地为应用程序添加安全保护。Spring Security
也提供了一种简单易用的方式来定制其过滤器链,以适应具体的安全需求。
2.Apache Shiro:
Apache Shiro
是一个易于使用的Java Web安全框架。它提供了一种简单的方式来管理应用程序中的身份验证、授权和加密。Apache Shiro
可以轻松地集成到Spring中,并提供了一系列构建块,以便定制其安全性行为。
3.JSON Web Token (JWT):
(1)不是一个完整的安全框架,但是被广泛用于在客户端和服务器之间安全地传递信息。
(2)常用于身份验证和声明传递。
JWT在前面的文章有过详细介绍,这里就不过多详述
文章链接一篇文章让你了解“JWT“-CSDN博客
三.为什么选择Spring Security
在介绍了这么多的主流安全框架,为什么要选择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而言,Shiro在这个环境下实际已经不具备优势了。因为Spring这个生态链现在是太强大了。
四.SpringSecurity讲解
1.什么是SpringSecurity?
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首先会进行用户认证。用户提供的用户名和密码将被验证,并与存储在数据库或其他身份验证来源中的用户凭据进行比较。
-
认证成功处理:如果用户的认证成功,Spring Security将生成一个安全上下文(SecurityContext),其中包含用户的身份信息和授权信息。这个上下文将被存储在安全上下文持有者(SecurityContextHolder)中,以供后续的请求使用。
-
授权处理:一旦用户通过认证,Spring Security将根据用户的角色和权限来判断用户是否有权访问请求的资源。它可以通过注解、配置文件或编程方式来配置授权规则。如果用户被授予访问资源的权限,Spring Security将允许用户继续请求。
-
认证失败处理:如果用户的认证失败,Spring Security将根据配置的处理方式返回响应,例如重定向到登录页面、返回错误信息等。
-
安全上下文传递:在整个请求处理过程中,Spring Security将安全上下文传递给其他组件,以确保每个组件都可以访问到用户的身份信息和授权信息。这样,在业务逻辑层、控制器层和视图层等各个组件中都可以使用安全上下文来进行身份验证和授权的处理。
3.快速入门
3.1 基于SpringBoot创建项目
创建SpringBoot所需要导入的依赖
<!-- 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>
配置application.yml 文件
spring:freemarker:# 设置freemarker模板后缀suffix: .ftl# 设置freemarker模板前缀template-loader-path: classpath:/templates/enabled: true
3.2 配置Spring Security
导入Spring Security依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
依赖详解
spring-security-core:
Spring Security
的核心模块,提供了基于权限的访问控制以及其他安全相关功能。spring-security-config:提供了
Spring Security
的配置实现,例如通过Java配置创建安全策略和配置Token存储等。spring-security-web:提供了
Spring Security Web
的基本功能,例如Servlet
集成和通过HttpSecurity
配置应用程序安全策略。
在application.yml
文件中配置自定义用户名和密码
spring:security:user:name: adminpassword: 123456
4.Web安全配置类
4.1HttpSecurity介绍
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 l |
logoutSuccessUrl() | 登出成功后跳转的 url 默认是/login?logout |
logoutSuccessHandler() | 登出成功处理器,设置后会把logoutSuccessUrl 置为null |
4.2 自定义登录
1.创建SecurityConfig配置类
创建WebSecurityConfig
配置类,设置@EnableWebSecurity
注解开启Spring Security
的默认行为。
package com.yu.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 //声明为配置类,与Spring绑定一起启动
@EnableWebSecurity //开启SpringSecurity的默认行为
public class WebSecurityConfig {@Beanpublic PasswordEncoder bcryptPasswordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic UserDetailsService userDetailsService() {UserDetails admin = User.withUsername("admin").password(bcryptPasswordEncoder().encode("123456")).roles("ADMIN", "USER").build();UserDetails user = User.withUsername("user").password(bcryptPasswordEncoder().encode("123456")).roles("USER").build();return new InMemoryUserDetailsManager(admin, user);}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/toLogin").permitAll().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("ADMIN", "USER").anyRequest().authenticated().and().formLogin().loginPage("/toLogin").loginProcessingUrl("/userLogin").usernameParameter("username").passwordParameter("password").and().logout().logoutUrl("/logout").logoutSuccessUrl("/");return http.build();}}
2.创建Controller
控制路由
@Controller
public class UserController {@RequestMapping("/toLogin")public String toLogin(){return "login";}@RequestMapping("/userLogin")public String userLogin(String username,String password){System.out.println("username="+username+",password="+password);return "index";}@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";}
}
3.登录模板页面
<h1>用户登录</h1>
<form action="/userLogin" method="post"><label>用户:</label><input type="text" name="username"/><br/><label>密码:</label><input type="password" name="password"/><br/><input type="submit" value="登录"/>
</form>
4.配置多角色访问
在application.yml文件进行配置
spring:freemarker:suffix: .ftltemplate-loader-path: classpath:/templates/enabled: true
5.配置自定义异常处理器
修改SecurityConfig
配置类,添加自定义异常处理,并设置异常处理页面。
http.exceptionHandling().accessDeniedPage("/noAccess");
当我们做权限管理时,普通用户误操作其他管理员界面,会进行异常跳转页面处理,这个要根据实际情况实际考虑
4.3异常小结
重启项目,跳转登录页重新登录。这时发现登录不成功,后台控制台也没有产生任何异常信息,通过浏览器的网络(network)查看现实登录请求接口302错误。
解决方案:关闭csrf
修改
SecurityConfig
配置类,添加关闭csrf
配置。http.csrf().disable();
总结:
Spring Security可以很好得保证我们的安全性问题,但是在本次的自定义登录中还是要注意:
1.因为使用的是模拟登录,所以在实际操作创建用户时还是要按正规程序执行,并将限制用户进行传参验证
2.在Controller层中配置创建路由时,要注意路由名称,配置模板信息要与yml配置文件一致
相关文章:
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…...
spark-常用算子
一,Transformation变换/转换算子: 这种变换并不触发提交作业,这种算子是延迟执行的,也就是说从一个RDD转换生成另一个RDD的转换操作不是马上执行,需要等到有Action操作的时候才会真正触发。 1.Value数据类型的Transf…...
《opencv实用探索·二十一》人脸识别
Haar级联分类器 在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。用的最多的是Haar特征人脸检测。 Haar级联分类器是一种用于目标检测的机器学习方法,它是一种基于机器学习的特征选择方法,…...
前端项目配置下载源npm, yarn,pnpm
前端项目配置下载源 npm: npm config set registry registryhttps://registry.npmmirror.com -g验证: npm config get registry yarn: yarn config set registry registryhttps://registry.npmmirror.com -gyarn config get registryyarn找不到, 需要管理员在命令行: set-exec…...
Elasticsearch之ik中文分词篇
Elasticsearch之ik中文分词篇 ik分词器插件ik分词器安装ik分词模式es ik分词测试 ik分词器插件 es在7.3版本已经支持中文分词,由于中文分词只能支持到单个字进行分词,不够灵活与适配我们平常使用习惯,所以有很多对应中文分词出现,…...
2023_Spark_实验三十:测试Flume到Kafka
实验目的:测试Flume采集数据发送到Kafka 实验方法:通过centos7集群测试,将flume采集的数据放到kafka中 实验步骤: 一、 kafka可视化工具介绍 Kafka Tool是一个用于管理和使用Apache Kafka集群的GUI应用程序。 Kafka Tool提供了…...
urllib2 HTTP头部注入
文章目录 注入原理例题 [SWPU 2016]web7 注入原理 参考文章 应用场景是具有SSRF漏洞,结合CRLF注入 我们以redis数据库为例,当存在SSRF时我们伪造以下请求 http://127.0.0.1%0d%0aCONFIG%20SET%20dir%20%2ftmp%0d%0aCONFIG%20SET%20dbfilename%20evil%…...
在 WebRTC 中,Offer/Answer 模型是协商 WebRTC 连接参数的关键部分
在 WebRTC 中,Offer/Answer 模型是协商 WebRTC 连接参数的关键部分。当 Offer 和 Answer 交换失败时,可能涉及到多个原因。以下是一些可能的问题和解决方案: SDP 格式错误: Session Description Protocol(SDPÿ…...
数据结构:图解手撕B-树以及B树的优化和索引
文章目录 为什么需要引入B-树?B树是什么?B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树? 回忆一下前面的搜索结构,有哈希,红黑树,二分…等很多的搜索结构&a…...
useConsole的封装,vue,react,htmlscript标签,通用
之前用了接近hack的方式实现了console的封装,目标是获取console.log函数的执行(调用栈所在位置)所在的代码行数。 例如以下代码,执行window.mylog(1)时候,console.log实际是在匿名的箭头函数()>{//这里执行的} con…...
Azure Machine Learning - 提示工程高级技术
本指南将指导你提示设计和提示工程方面的一些高级技术。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,…...
七款创意项目管理软件解决方案推荐:高效项目管理与团队协作工具
企业无论大小,都离不开项目经理、营销团队和创意人员。他们参与各种头脑风暴,为特定目标打造项目。然而,在创意项目管理中,细节决定成败。若处理不当,可能导致项目失败和混乱。 过去,创意项目管理依赖纸质规…...
如何在公网环境下使用Potplayer访问本地群晖webdav中的影视资源
文章目录 本教程解决的问题是:按照本教程方法操作后,达到的效果是:1 使用环境要求:2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透,映射至公网4 使用固定地址在potplayer访问webdav 国内流媒体平台的内…...
数据可视化Seaborn
数据可视化Seaborn Seaborn简介Seaborn API第一个Seaborn应用Seaborn基本概念Seaborn图表类型Seaborn数据集Seaborn样式Seaborn调色板Seaborn分面网格Seaborn统计图表Seaborn散点图Seaborn折线图Seaborn柱状图Seaborn箱线图Seaborn核密度估计图Seaborn分类散点图Seaborn回归分…...
AWS S3相关配置笔记
关闭 阻止所有公开访问 存储桶策略(开放外部访问) {"Version": "2012-10-17","Id": "S3PolicyId1","Statement": [{"Sid": "statement1","Effect": "Allow","Principal"…...
linux:linux的小动物们(ubuntu)
1.蒸汽小火车 输入下面的命令下载,再输出sl sudo apt-get install sl sl2.今天你哞了吗 apt-get moo 3.会说话的小牛 输入下面的命令下载一下 sudo apt-get install cowsay输入这个 cowsay jianbing cowsay -l 查看其它动物的名字 然后cowsay -f 跟上动物名&…...
每日一题(LeetCode)----栈和队列--逆波兰表达式求值
每日一题(LeetCode)----栈和队列–逆波兰表达式求值 1.题目(150. 逆波兰表达式求值) 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算…...
2023年第四届 “赣网杯” 网络安全大赛 gwb-web3 Write UP【PHP 临时函数名特性 + 绕过trim函数】
一、题目如下: 二、代码解读: 这段代码是一个简单的PHP脚本,它接受通过GET请求传递的两个参数:‘pass’和’func’: ① $password trim($_GET[pass] ?? );:从GET请求中获取名为’pass’的参数࿰…...
软件设计师——软件工程(一)
📑前言 本文主要是【软件工程】——软件设计师——软件工程的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄…...
阿里云|人工智能(AI)技术解决方案
函数计算部署Stable Diffusion AI绘画技术解决方案 通过函数计算快速部署Stable Diffusion模型为用户提供快速通过文字生成图片的能力。该方案通过函数计算快速搭建了AIGC的能力,无需管理服务器等基础设施,专注模型的能力即可。该方案具有高效免运维、弹…...
Axure中继器的使用
一.中继器介绍 在Axure中,中继器(Relays)是一种功能强大的元件,可以用于创建可重复使用的模板或组件。中继器允许您定义一个主要的模板,并在页面中重复使用该模板的实例。以下是中继器的作用和优缺点: 作…...
猫罐头哪个牌子好性价比高?五大性价比高的品牌推荐
很多猫奴担心猫咪天天吃干猫粮可能会导致营养不足,所以想给猫咪换换口味,改善一下饮食。这时,选择猫罐头是个不错的选择。不过,喂猫罐头也是有一些讲究的。 作为从业6年的宠物护理师来说,作为早在几年就开始接触猫罐头…...
威海网站优化/网站免费推广方式
javaScript RegExp对象: global——Boolean值、表示g(全局选项)是否已设置 ignoreCase——Boolean值、表示i(忽略大小写选项)是否已设置 lastIndex——整数、代表下次匹配将会从哪个字符位置开始(只有当使用exec()或test()函数才会填入、否则为0) mult…...
电商网站系统建设/品牌推广方案包括哪些
C#格式化数值结果表 字符 说明 示例 输出 C货币string.Format("{0:C3}", 2)$2.000D十进制string.Format("{0:D3}", 2)002E科学计数法1.20E0011.20E001G常规string.Format("{0:G}", 2)2N用分号隔开的数字string.Format("{0:N}…...
嘉兴专业网站建设/百度快照什么意思
up主0x000006b怎么办,开机就蓝屏,安全模式也是,好像是因为下载一个东西时我强制关机了,重新开机就蓝屏了。电脑小白[大哭][大哭][大哭][大哭]可能是你下载的“软件”和电脑中的“内存”有冲突了我给你12种方法调试,快试试吧&#…...
昆明seo网站建设/湖南好搜公司seo
Bingo! 正如你所猜测的那样,这篇文章是讲人员招聘的。 感谢计算机,正因为有了它,我们不需要真的有水果,就能玩切水果的游戏。 如果你是一个水果罐头制造商,那么你需要操心的是从哪里购买水果原料、怎样运输、怎样建造厂…...
网络营销工作/sem优化软件选哪家
条款7 预先准备好内存不够的情况 operator new在无法完成内存分配请求时会抛出异常(老的编译器返回0); C常用的做法, 定义一个类型无关的宏来分配内存并检查是否成功; 123#define NEW(PTR, TYPE) \try { (PTR) new TYPE; } \catch (std::bad_alloc&) { assert(0); }>…...
做彩票网站要什么接口/网络推广优化方案
一、函数的基本概念 1.1 函数在数学中的概念 函数指一个量随着另一个量的变化而变化。 函数的数学形式:yf(x) f是一种定义好的关系,可以简称为函数,在函数f中,只要x值的确定,那么y的值一定是确定的。y的值随x值的变化…...