当前位置: 首页 > news >正文

微服务下的SpringSecurity认证端

从三板斧开始微服务下的SpringSecurity开始

一、引入组件包

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

二、创建适配器

AuthorizationServerConfigurerAdapter是一个授权适配器,在这个适配器中有如下几个核心方法:

  • ClientDetailsServiceConfigurer

用来配置客户端详情服务(ClientDetailsService),这里的配置表明不是任何人都可以来授权中心进行授权的,客户端详情信息在这里进行初始化,可以在内存中也可以来自于数据库,根据你自己的需要进行配置;一个ClientDetails标识一个客户端的详情描述,ClientDetails具体的属性如下:

重要属性说明
属性名称说明
clientId是一个唯一标识,用于标识客户
secret客户端的安全码;微信登录就有安全码
scope用来限制客户端的访问范围,如果为空,标识所有范围都可以访问
authrizedGrantTypes可以使用的授权类型(可选值范围:"authorization_code", "password", "client_credentials", "implicit", "refresh_token"),为空标识所有都支持;微信仅支持authorization_code;
authorities客户端可以使用的权限(基于Spring Security Authorities)
redirectUris回调地址,授权服务会往此地址回调推送客户端相关信息

ClientDetails客户端详情可以在运行时进行更新,可以通过访问底层存储介质(例如:JdbcClientDetailsService)或者自己实现ClientRegisterationService接口或者实现ClientDetailsService来进行定制;

  • AuthorizationServerSecurityConfigurer

配置令牌端点的安全约束;此接口包含了关于令牌管理的必要操作;

实现一个AuthorizationServerTokenServices接口需要继承DefaultTokenServices这个类;此类中包含了一些有用的实现,可以使用它来修改令牌的格式和令牌的存储模式;默认情况下,在创建一个令牌的时候,是使用随机值来进行填充的;这个类中完成了令牌管理的几乎所有事情,唯一需要依赖的是Spring容器中的一个TokenStore对象来定制令牌持久化;在Spring中有一个默认的TokenStore实现,即:ImMemoryTokenStore,这个类是将令牌保存到内存中,其他几个TokenStore实现类都可以根据自己的选择进行使用;

ImMemoryTokenStore:基于内存;

JdbcTokenStore:基于JDBC;

JwtTokenStore:基于JWT,这里啰嗦一下,此种类型时经常常用的类型,全称是“Json web Token”;是吧令牌信息全部编码到令牌本身,这样后端不需要维护令牌相关的信息,这是一大优势,当然缺点就是撤销令牌困难;传输占用空间比较大;

  • AuthorizationServerEndpointsConfigurer

用来配置令牌的访问端点和令牌服务;授权类型(Grant Types)有如下几点:

授权类型说明
授权类型说明
authenticationManager认证管理器,如果你选择的是password(资源所有者密码)这个授权类型时,需要指定authenticationManager对象来进行鉴权
userDetailsService用户主体管理服务,在拥有自己UserDetailsService接口的实现,如果设置了这个属性,那么refresh_token刷新令牌的方式授权类型流程中会多一个检查的步骤,来确保是否依然有效
authorizationCodeServices用于authorization_code授权码模式,用来设置授权服务;
implicitGrantService用于设置隐式授权模式的状态;
tokenGranter这个是深度拓展时使用的;一旦设置,授权将会全部交由自己来掌控,会忽略以上几个属性;

 

  1 @Configuration2 @EnableAuthorizationServer3 @EnableConfigurationProperties(value = JwtCaProperties.class)4 public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {5 6     /**7      * 属性描述:注入数据源8      *9      * @date : 2020/4/12 0012 上午 11:5410      */11     private final DataSource dataSource;12 13     /**14      * 属性描述:JWT配置信息15      *16      * @date : 2020/4/12 0012 下午 10:4917      */18     private final JwtCaProperties jwtCaProperties;19 20     /**21      * 属性描述:用户信息处理22      *23      * @date : 2020/4/13 0013 上午 12:1224      */25     private final MyUserDetailServiceImpl myUserDetailServiceImpl;26 27     private final AuthenticationManager authenticationManager;28 29     /**30      * 功能描述:认证中心配置31      *32      * @author : XXSD33      * @date : 2020/4/12 0012 上午 11:5434      */35     public AuthServerConfig(DataSource dataSource, JwtCaProperties jwtCaProperties, MyUserDetailServiceImpl myUserDetailServiceImpl, AuthenticationManager authenticationManager) {36         this.dataSource = dataSource;37         this.jwtCaProperties = jwtCaProperties;38         this.myUserDetailServiceImpl = myUserDetailServiceImpl;39         this.authenticationManager = authenticationManager;40     }41 42     /**43      * 功能描述:配置第三方客户端的授权服务器安全配置44      * <br />45      * 用来配置令牌的端点安全约束46      *47      * @author : XXSD48      * @date : 2020/4/14 0014 下午 8:5549      */50     @Override51     public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {52         //第三方客户端校验token需要带入 clientId 和clientSecret来校验53         security.checkTokenAccess("isAuthenticated()")54                 //来获取我们的tokenKey需要带入clientId,clientSecret55                 .tokenKeyAccess("isAuthenticated()");56         //使用表单认证的方式进行申领令牌57         security.allowFormAuthenticationForClients();58     }59 60     /**61      * 功能描述:配置接入的客户端62      * <br />63      * 用来配置客户端详情(ClientDetailsService),客户端详情杂这里进行初始化,可以把客户端详情信息写死或这通过64      * 数据库来存储详情信息65      *66      * @author : XXSD67      * @date : 2020/4/12 0012 上午 11:4968      */69     @Override70     public void configure(ClientDetailsServiceConfigurer clients) throws Exception {71         /*//使用内存方式72         clients.inMemory()73                 .withClient("这里写客户端的ID")74                 .secret(new BCryptPasswordEncoder().encode("这里放入密码"))75                 .resourceIds("这里是客户端的资源列表")76                 //此客户端可以使用的授权类型77                 .authorizedGrantTypes("authorization_code", "password", "client_credentials", "implicit", "refresh_token")78                 .scopes("允许的授权范围;没有什么特殊的意义,就是一个字符串,是自己根据我们后台的服务进行的一个划分而已")79                 //跳转到授权页面,是否显示授权页面;True标识默认用户同意,不显示授权页面80                 .autoApprove(false)81                 .redirectUris("这里写入你自己的回调地址");82                 //如果有更多的,在这里添加and83                 .and()84                 */85         clients.withClientDetails(clientDetails());86     }87 88     /**89      * 功能描述:配置Token信息90      * <br />91      * 用于配置令牌(Token)的访问端点和令牌服务(TokenService)92      *93      * @author : XXSD94      * @date : 2020/4/12 0012 下午 11:2395      */96     @Override97     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {98 99         /*
100         * AuthorizationServerEndpointsConfigurer对于不同类型的授权类别也需要配置不同的属性
101         * authenticationManager:
102         * 认证管理器,如果你选择的是password(资源所有者密码)这个授权类型时,需要指定authenticationManager对象来进行鉴权
103         * userDetailsService:
104         * 用户主体管理服务,在拥有自己UserDetailsService接口的实现,如果设置了这个属性,那么refresh_token刷新令牌的方式授权类型流程中会多一个检查的步骤,来确保是否依然有效
105         * authorizationCodeServices:
106         * 用于authorization_code授权码模式,用来设置授权服务;
107         * implicitGrantService:
108         * 用于设置隐式授权模式的状态;
109         * tokenGranter:
110         * 这个是深度拓展时使用的;一旦设置,授权将会全部交由自己来掌控,会忽略以上几个属性;
111         * */
112 
113         final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
114         //加入了之后增强器才有效果
115         tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnchaner(), jwtAccessTokenConverter()));
116         /*
117         * OAuth2.0已经默认配置了几个端点:
118         * /oauth/authorize:授权端点;
119         * /oauth/token:令牌端点;
120         * /oauth/confirm_access:用户确认授权提交的端点;
121         * /oauth/error:授权服务错误信息端点;
122         * /oauth/check_token:用于资源服务访问的令牌进行解析的端点;
123         * /oauth/token_key:使用JWT令牌需要用到的提供共有密钥的端点;
124         * */
125         endpoints
126                 //自定义重新定义端点路径
127 //                .pathMapping("")
128                 .tokenStore(tokenStore())
129                 .tokenEnhancer(tokenEnhancerChain)
130                 .userDetailsService(myUserDetailServiceImpl)
131                 //指定令牌管理服务
132 //                .tokenServices(tokenServices())
133                 //限制Token的信息允许提交的模式
134 //                .allowedTokenEndpointRequestMethods(HttpMethod.POST);
135                 .authenticationManager(authenticationManager);
136     }
137 
138     /*private AuthorizationServerTokenServices tokenServices(){
139         final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
140         //客户端详情服务
141         defaultTokenServices.setClientDetailsService(clientDetails());
142         //令牌自动刷新
143         defaultTokenServices.setSupportRefreshToken(true);
144         //令牌存储策略
145         defaultTokenServices.setTokenStore(tokenStore());
146         //令牌默认有效期,当前设置为2小时;单位秒
147         defaultTokenServices.setAccessTokenValiditySeconds(7200);
148         //刷新令牌默认有效期,当前设置为3天;单位秒
149         defaultTokenServices.setRefreshTokenValiditySeconds(259200);
150 
151         return defaultTokenServices;
152     }*/
153 
154     /**
155      * 功能描述:注入基于JWT的自定义Token增强器
156      *
157      * @author : XXSD
158      * @date : 2020/4/12 0012 下午 11:21
159      */
160     @Bean
161     public AuthTokenEnchaner tokenEnchaner() {
162         return new AuthTokenEnchaner();
163     }
164 
165     /**
166      * 功能描述:Token存储控制对象
167      *
168      * @author : XXSD
169      * @date : 2020/4/12 0012 下午 1:01
170      */
171     @Bean
172     public TokenStore tokenStore() {
173         /*
174          * Token有如下几种方式存储:
175          * 1、基于内存:InMemoryTokenStore;
176          * 2、基于数据库:JdbcTokenStore;
177          * 3、基于Redis:RedisTokenStore;
178          * 4、基于JWT:JwtTokenStore
179          * 这里是基于JWT的
180          * */
181         return new JwtTokenStore(jwtAccessTokenConverter());
182     }
183 
184     /**
185      * 功能描述:Token与用户信息之间的转换器
186      *
187      * @author : XXSD
188      * @date : 2020/4/12 0012 下午 1:01
189      */
190     @Bean
191     public JwtAccessTokenConverter jwtAccessTokenConverter() {
192         final JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
193         jwtAccessTokenConverter.setKeyPair(keyPair());
194         return jwtAccessTokenConverter;
195     }
196 
197     /**
198      * 功能描述:注入证书
199      *
200      * @author : XXSD
201      * @date : 2020/4/12 0012 下午 11:22
202      */
203     @Bean
204     public KeyPair keyPair() {
205         KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource(jwtCaProperties.getKeyPairName()), jwtCaProperties.getKeyPairSecret().toCharArray());
206         return keyStoreKeyFactory.getKeyPair(jwtCaProperties.getKeyPairAlias(), jwtCaProperties.getKeyPairStoreSecret().toCharArray());
207     }
208 
209     /**
210      * 功能描述:客户端处理服务
211      *
212      * @author : XXSD
213      * @date : 2020/4/12 0012 上午 11:58
214      */
215     @Bean
216     public ClientDetailsService clientDetails() {
217         /*
218         * 如果是使用JDBC的方式进行,那么就需要在数据库中创建一个表
219         * 表的名称为:oauth_client_details
220         * CREATE TABLE `oauth_client_details` (
221             -- 标识客户端的ID;
222             `client_id` varchar(256) CHARACTER SET utf8 NOT NULL,
223             `resource_ids` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
224             -- 客户端安全码;
225             `client_secret` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
226             -- 用来限制客户端的访问范围,如果为空标识客户端拥有全部的访问范围
227             `scope` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
228             -- authrized;此客户端可以使用的授权类型,默认为空(全部可用:authorizaton_code、password、client_credentals、implicit、refresh_token);注:在微信中只支持authoriazton_code这一种
229             `authorized_grant_types` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
230             -- 回调的地址;授权服务会往此地址推送客户端的相关信息
231             `web_server_redirect_uri` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
232             -- 此客户端可以使用的权限(基于Spring Security authorities)
233             `authorities` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
234             `access_token_validity` int(11) DEFAULT NULL,
235             `refresh_token_validity` int(11) DEFAULT NULL,
236             `additional_information` varchar(4096) CHARACTER SET utf8 DEFAULT NULL,
237             -- 跳转到授权页面,是否跳转到授权同意页面
238             `autoapprove` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
239             PRIMARY KEY (`client_id`)
240             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
241         * */
242         return new JdbcClientDetailsService(dataSource);
243     }
244 }

三、授权中心配置

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {/*** 属性描述:认证服务器加载用户信息对象** @date : 2020/4/13 0013 上午 12:16*/private final MyUserDetailServiceImpl myUserDetailServiceImpl;/*** 功能描述:授权中心安全配置** @author : XXSD* @date : 2020/10/10 0010 下午 1:11*/public WebSecurityConfig(MyUserDetailServiceImpl myUserDetailServiceImpl) {this.myUserDetailServiceImpl = myUserDetailServiceImpl;}/*** 功能描述:用于构建用户认证组件,需要传递userDetailsService和密码加密器** @author : XXSD* @date : 2020/4/13 0013 上午 12:15*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(myUserDetailServiceImpl).passwordEncoder(passwordEncoder());}/*** 功能描述:配置安全拦截策略** @author : XXSD* @date : 2021/1/9 0009 下午 6:34*/@Overrideprotected void configure(HttpSecurity http) throws Exception {http//关闭CSRF跨域检查.csrf().disable()
//                .authorizeRequests()
//                //配置其他请求要求登录
//                .anyRequest().authenticated()
//                //设置并行策略
//                .and()
//                // 可以从默认的login页面登录
//                .formLogin();}/*** 设置前台静态资源不拦截*/@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/assets/**", "/css/**", "/images/**");}/*** 功能描述:随机密码加密器** @author : XXSD* @date : 2020/4/13 0013 上午 12:19*/@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Bean@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}}

相关文章:

微服务下的SpringSecurity认证端

从三板斧开始微服务下的SpringSecurity开始 一、引入组件包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> 二、创建适配器 AuthorizationServerConfig…...

苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点

Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标&#xff0c;从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏&#xff1a;Bartender 允许用户隐藏菜单栏图标&#xff0c;只在需要时显示。这样可以…...

笙默考试管理系统-MyExamTest----codemirror(65)

笙默考试管理系统-MyExamTest----codemirror&#xff08;65&#xff09; 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…...

git在本地创建dev分支并和远程的dev分支关联起来

文章目录 git在本地创建dev分支并和远程的dev分支关联起来1. 使用git命令2. 使用idea2.1 先删除上面建的本地分支dev2.2 通过idea建dev分支并和远程dev分支关联 3. 查看本地分支和远程分支的关系 git在本地创建dev分支并和远程的dev分支关联起来 1. 使用git命令 git checkout…...

【C++】深入了解构造函数之初始化列表

目录 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…...

差分--差分数组快速计算L到R值相加后的数组

目录 差分&#xff1a;思路代码&#xff1a; 原题链接 差分&#xff1a; 输入一个长度为 n 的整数序列。 接下来输入 m 个操作&#xff0c;每个操作包含三个整数 l,r,c &#xff0c;表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第…...

《NLP入门到精通》栏目导读(01/2)

一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》,因此,读者需要一定得深度学习基础,才能过度到此栏目内容。 二、博客建设理念 本博客基地,将建成人工智能领域的参考资料库;…...

three.js实现电子围栏效果(纹理贴图)

three.js实现电子围栏效果&#xff08;纹理贴图&#xff09; 实现步骤 围栏的坐标坐标转换为几何体顶点&#xff0c;uv顶点坐标加载贴图&#xff0c;移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…...

DHSP和DNS

一、服务程序 1.1DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服务组…...

Python冒号的解释

1. “没什么首次没有为第二个&#xff0c;跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始&#xff1a;结束&#xff1a;一步]和任何启动&#xff0c;停止或结束可以被丢弃。a[::3]是每第三个序列。…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

固乔快递查询助手:批量、快速、全面的快递信息查询软件

在快递行业飞速发展的今天&#xff0c;如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件&#xff0c;支持多家主流快递公司查询。用户只需输入单号&#xff0c;即可快速查询到实时…...

C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

归并排序 归并算法采用非常经典的分治策略&#xff0c;每次把序列分成n/2的长度&#xff0c;将问题分解成小问题&#xff0c;由复杂变简单。 因为使用了递归算法&#xff0c;不能用于大数据的排序。 核心代码&#xff1a; using System; using System.Text; using System.Co…...

Linux的网络服务DHCP

一.了解DHCP服务 1.1 DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服…...

【小沐学CAD】开源Assimp库导入三维模型(C++、Python)

文章目录 1、简介2、下载编译3、代码测试3.1 C3.2 pyassimp&#xff08;Python&#xff09; 结语 1、简介 https://github.com/assimp/assimp Open Asset Import Library 是一个库&#xff0c;用于将各种 3D 文件格式加载为共享的内存格式。它支持 40 多种用于导入的文件格式和…...

RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动

关键词&#xff1a;SFUD,FLASH,W25Q64&#xff0c;W25Q128&#xff0c;STM32F407 说明&#xff1a;RT-Thread 系统 使用 SPI万能驱动 SFUD 驱动 Flash W25Q64&#xff0c;通过 STM32CubeMX 配置 STM32 SPI 驱动。 提示&#xff1a;SFUD添加后的存储位置 1.打开RT-Thread Sett…...

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本&#xff1a;2.1.2 使用create创建指定版本的虚拟环境&#xff1a;2.1.3 使用env list查看虚拟环境列表…...

RabbitMQ的关键概念解析

RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;它允许应用程序通过复杂的路由和存储机制来交换数据。理解 RabbitMQ 的核心概念对于有效地使用它至关重要。以下是 RabbitMQ 的一些关键概念及其工作流程&#xff1a; 关键概念 生产者&#xff08;Producer&#xff09; 生产…...

Python快速排序

快速排序是一种常用的排序算法&#xff0c;它通过递归地将数组分割成较小的子数组&#xff0c;然后对这些子数组进行排序&#xff0c;最终将它们合并成一个有序的数组。具体步骤如下&#xff1a; 1. 选择一个基准元素&#xff0c;通常是数组中的第一个元素。 2. 将数组分成两部…...

SpringBoot整合人大金仓数据库KingBase

1 去KingBase官网下载驱动jar包 2 将解压得到的所有jar包放置在libs目录下&#xff08;没有就新建一个目录&#xff09; 3 在pom文件添加相关依赖 <!--添加KingBase所需要的依赖--> <dependency><groupId>com.kingbase</groupId><artifactId>kin…...

Phoenix基本使用

1、Phoenix简介 1.1 Phoenix定义 Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表&#xff0c;插入数据和查询HBase数据。 1.2 Phoenix特点 容易集成&#xff1a;如Spark&#xff0c;Hive&#xff0c;Pig&#xff0c;Flume和Map Reduce。性能…...

31-35.玩转Linux操作系统

玩转Linux操作系统 说明&#xff1a;本文中对Linux命令的讲解都是基于名为CentOS的Linux发行版本&#xff0c;我自己使用的是阿里云服务器&#xff0c;系统版本为CentOS Linux release 7.6.1810。不同的Linux发行版本在Shell命令和工具程序上会有一些差别&#xff0c;但是这些差…...

windows下载官方正版notepad++

一、前言 notepad是一款非常好用的编辑器&#xff0c;简洁、快速、高效。可是很多时候我们想去官网下载时&#xff0c;百度出来的都是一堆第三方下载地址&#xff0c;捆绑流氓软件&#xff0c;要么就是付费&#xff0c;作为一款优秀开源软件&#xff0c;我们必须要知道正确的下…...

Jmeter+ant+jenkins持续集成

一、环境准备 1、 jdk环境 要求JDK1.8以上&#xff0c;命令行输入&#xff1a;java -version&#xff0c;出现如下提示说明安装成功。 2、 Jmeter环境 下载Jmeter最新版本&#xff0c;解压即可&#xff0c;添加bin目录到环境变量。 3、 Ant环境 设置ant环境变量&#xff0…...

利用邮件发送附件来实现一键巡检,附件是通过调用zabbix api生成的word和Excel

HTML部分&#xff1a; <!DOCTYPE html> <html> <head><title>自动巡检</title><!-- 加入CSS样式 --> </head> <body><form id"inspectionForm"><label for"email">邮箱地址:</label>&…...

Linux 常用指令汇总

Linux 常用指令汇总 文章目录 Linux 常用指令汇总[toc]前言一、文件目录指令pwd 指令ls 指令cd 指令mkdir 指令rmdir 指令tree 指令cp 指令rm 指令mv 指令cat 指令more 指令less 指令head 指令tail 指令echo 指令> 指令>> 指令 二、时间日期指令date 指令cal 指令 三、…...

SpringBoot 注解超全详解(整合超详细版本)

使用注解的优势&#xff1a; 采用纯java代码&#xff0c;不在需要配置繁杂的xml文件 在配置中也可享受面向对象带来的好处 类型安全对重构可以提供良好的支持 减少复杂配置文件的同时亦能享受到springIoC容器提供的功能 1注解详解&#xff08;配备了完善的释义&#xff09…...

Redis:原理速成+项目实战——Redis实战9(秒杀优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战8&#xff08;基于Redis的分布式锁及优化&#xff09; &#x1f4da;订阅专栏&…...

【I2多语言】多语言快速上手

简介 官方API&#xff1a;http://www.inter-illusion.com/assets/I2LocalizationManual/I2LocalizationManual.html意义&#xff1a;更改游戏语言&#xff08;多语言支持&#xff09; 快速上手 插件安装&#xff1a; 直接拖拽进Unity即可 创建语言源&#xff08;Creating a …...

【野火i.MX6ULL开发板】开发板连接网络(WiFi)与 SSH 登录、上电自动登录、设置静态IP、板子默认参数

0、前言 参考之前自己写的&#xff1a; http://t.csdnimg.cn/g60P8 参考资料&#xff1a; [野火]《Linux基础与应用开发实战指南——基于i.MX6ULL开发板》_20230323 从野火官网下载 参考博客&#xff1a; http://t.csdnimg.cn/8uh4O 参考官方文档&#xff1a; https://doc.…...