idea刷新Gradle项目Failed to apply plugin 'spring-boot'报错

* What went wrong:A problem occurred evaluating script.> Failed to apply plugin 'spring-boot'. > Configuration with name 'runtime' not found.* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.* Get more help at https://help.gradle.org以上报错,原因可能是缺失.\gradle\wrapper\gradle-wrapper.jar、.\gradle\wrapper\gradle-wrapper.properties文件。补全相关文件即可。Gradlew是包装器,自动下载包装里定义好的gradle 版本,保证编译环境统一,gradle 是用本地的gradle。

IDEA 2021.3激活教程

idea 2021.2以下版本激活使用无限激活工具,下载地址(方式2):http://www.idejihuo.com/网盘下载:https://hik.lanzoup.com/i4Ygxz1whejide-eval-resetter.zip和reset_script.zip,第一个是破解工具,第二个是重置试用期的脚本。直接将压缩包ide-eval-resetter.zip拖拽到IDE的界面,如果拖拽时,IDE卡主,可以通过本地导入,菜单栏选择 File -> Setting -> Plugins ,Install plugin,然后选择插件位置,确定即可或者手动添加zhile仓库,通过配置IDE插件仓库,远程下载通过配置仓库,远程下载,不过只能下载破解工具,没有重置试用期的脚本,但是相对更新比较方便,可以及时的更新工具:点击IDE菜单栏,File -> Settings -> Plugins,点击齿轮按钮,选择Manage plugin Repositories,添加 仓库地址:https://plugins.zhile.io ,完成后,点击确定,保存。再次,返回到插件页面。搜索 “reset”,找到“IDE Eval Reset”,直接安装(我这里已经安装过了),插件安装完成,都会提示你是否重启IDE,点击“Restart IDE”,重启IDE。配置破解工具点击菜单栏 Help,选择工具的选项,打开工具界面。工具刚安装,此时看到工具界面显示 Last Reset Time:Not Yet,提示还没有生效。说明工具还没有生效。这个很重要(一些小伙伴也安装了工具,但是隔天就失效了,这个就是原因所在,根本就没有生效)。把右下角的“Auto reset…” 勾选,这样每次重启IDE的时候,试用期都会被重新初始化,恢复30天的试用期。然后,点击右下角的Reload,并点击Reset,重启IDE重启之后,我们再次打开IntelliJ IDEA,选择Help -> Eval Reset 进入到工具的界面。看下时间是否被重置,如果Last Reset Time 时间被重置,说明插件已经生效。我们这里的时间已经变成了2021-08-18idea 2021.3激活试用激活码(到2022.2.12可能失效)4SKTQTYORL-eyJsaWNlbnNlSWQiOiI0U0tUUVRZT1JMIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IHd3d8K3YWppaHVvwrdjb20iLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJEUE4iLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRCIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQUyIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiSUkiLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTQyIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJHTyIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiRE0iLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTRiIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEUyIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJDIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiV1MiLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJBQyIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNWIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IkRDIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSU1UiLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRQIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBEQiIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQV1MiLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFNJIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBQUyIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQQ1dNUCIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQR08iLCJwYWlkVXBUbyI6IjIwMjItMDItMDIiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFBDIiwicGFpZFVwVG8iOiIyMDIyLTAyLTAyIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBSQiIsInBhaWRVcFRvIjoiMjAyMi0wMi0wMiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQU1ciLCJwYWlkVXBUbyI6IjIw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激活码无效处理修改VM配置文件,注意不是程序路径下的vm文件,一般存储在C盘,例如:C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2021.3\idea64.exe.vmoptions其中Administrator替换成自己电脑的用户名Mac用户可以去这几个路径下面查找/Users/用户名/Library/Application Support/IntelliJIdeaXXXXXX,用于保存安装的插件/Users/用户名/Library/Caches/IntelliJIdeaXXXXXX,用于保存缓存、日志、以及本地的版本控制信息(local history 这个功能)/Users/用户名/Library/Preferences/IntelliJIdeaXXXXXX,用于保存自己IDEA的个人配置,相当于 Windows版本的config目录/Users/用户名/Library/ApplicationSupport/JetBrains/IntelliJIdeaXXXXXX,这个目录下也有其配置文件如果你激活码有效能进去就直接通过Help -> Edit Custom VM Options…即可修改。找到idea64.exe.vmoptions后直接记事本打开添加插件路径即可。处理完之后,再次使用上述激活码即可,不出意外重启后就能在About里看到激活到2099了。具体编辑的内容如下:-Xmx2024m-javaagent:C:\Users\Administrator\Downloads\filter-agent\filter-agent.jar插件下载:https://hik.lanzoup.com/iIbxfyzi5mj来源:http://blog.idejihuo.com/jetbrains/how-do-i-add-agent-configuration-if-the-activation-code-is-invalid.htmlhttp://blog.idejihuo.com/jetbrains/intellij-idea2021-3-latest-version-cracked-patch-permanent-cracked-free-tutorial-filter-agent.html激活程序原版仓库:https://github.com/ja-netfilter/ja-netfilter/releases

IDEA开启GitHub AI 编程工具 Copilot

GitHub 在 2021年6月份联合 OpenAI,推出了一款“GitHub Copilot”工具,可以根据上下文自动写代码,包括文档字符串、注释、函数名称、代码,只要用户给出提示,就可以写出完整的函数。 Copilot支持Neovim 和 JetBrains IDE,包含开发者常用的 IntelliJ IDEA、PyCharm 等。同时增加了对 Java 中多行补全的支持,并计划在未来几个月内支持Python、Java、Type、Ruby 和 Go之外更多的语言,似乎真的是要大干一场。如果想用Copilot的话,需要将 IntelliJ IDEA 和 PyCharm 升级到 2021.2 或以上版本、Neovim 的版本则需要升级成 0.6 或以上版本,并且需要安装 Node.js v12 或以上版本。该版本idea直接在插件市场搜索Copilot安装即可,安装重启之后就可以在工具栏看到安装好的Copilot。在插件市场搜索结果里会看到Alibaba Cloud AI Coding Assistant(Cosy),这是阿里的编码智能补全功能,相关介绍可移步:https://help.aliyun.com/document_detail/368369.htmlCosy官网:https://developer.aliyun.com/tool/cosy感兴趣的可自行研究。

IDEA开启GitHub AI 编程工具 Copilot

IDEA "Cannot resolve symbol" 解决办法

IDEA 无法识别同一个 package 或是同一个模块里的其他类,将其显示为红色,但是 compile 没有问题。鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 IDEA ,重新 sync gradle,Clean build,重新导入项目 都没有用。多半是因为 IDEA 之前发生了错误,某些 setting 出了问题。解决方法如下:点击菜单中的 “File” -> “Invalidate Caches / Restart”,然后点击对话框中的 “Invalidate and Restart”,清空 cache 并且重启。语法就会正确的高亮了。

Windows上使用gitblit搭建本地git服务器

https://blog.csdn.net/longintchar/article/details/80787907

使用命令行将本地项目上传到git

使用命令行将本地项目上传到git1、(先进入项目文件夹)通过命令把这个目录变成git可以管理的仓库git init2、把文件添加到暂存区里面,不要忘记后面的小数点“.”,意为添加当前文件夹下所有文件git add .3、把文件提交到仓库,引号内为提交说明git commit -m "my first commit"4、关联到远程库git remote add origin 你的远程库地址# 例如:$ git remote add origin git@github.com:cutedandan/test.git5、获取远程库与本地同步合并(如果远程库不为空,必须做这一步,否则后面的提交会失败),如果远程库是空的可以忽略git pull --rebase origin master6、把本地库的内容推送到远程,实际上是把当前分支master推送到远程,然后输入密码,验证通过即开始上传git push -u origin master如果项目很大,想用idea推送项目到仓库会很慢,可以试试命令行方式。

Maven引用本地lib文件夹内jar包

在一个项目中使用了maven,也使用了本地jar包,若这jar包不能通过一般maven进行使用,因为在公共的maven库中没此包下载不了导致打包失败。可以通过添加相关配置解决,例如引用iceblue的包,直接引用会显示无法下载。只需: <dependency> <groupId> e-iceblue </groupId> <artifactId>spire.pdf</artifactId> <version>3.11.6</version> <scope>system</scope> <systemPath>${project.basedir}/lib/spire.pdf-3.11.6.jar</systemPath> </dependency> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf.free</artifactId> <version>3.9.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/spire.pdf.free-3.9.0.jar</systemPath> </dependency>并且在插件中配置(以下是以springboot项目为例) <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>com.example.demo.ProjectSeedMasterApplication</mainClass> <includeSystemScope>true</includeSystemScope> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>

Nginx+Keepalived实现Nginx高可用离线安装教程

下文假定192.168.1.100、192.168.1.101为两台keepalived+Nginx服务器,192.168.1.102为虚拟IP(即VIP)。在架构设计中,可以利用Nginx反向代理和负载均衡实现后端应用的高可用性,同时我们还需要考虑Nginx的单点故障。因此可改成多Nginx服务,每台Nginx服务器上用keepalived监测Nginx是否正常,不正常会重新启动Nginx,启动不成功会自己杀掉自己由另一台keepalived服务器接管,真正做到架构高可用性。其实并非两台机器100、101都绑定了VIP,两台keepalived配置有主备优先级配置,优先级高的会拿到VIP,例如100拿到VIP后,那访问102就是实际访问的是100上的Nginx,当把100上Keepalived进程关闭,101会得到VIP,这是访问VIP就是访问101上的Nginx了。安装keepalived依赖的包若在步骤二编译安装keepalived时候提示缺libnl/libnl3 dev,需上传依赖至文件夹/opt/rpm:libnl-1.1.4-3.el7.x86_64.rpm、libnl-devel-1.1.4-3.el7.x86_64.rpmx86_64下载:https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/cd /opt/rpmrpm -ivh *.rpm --nodeps --force执行上述命令进行安装依赖。对于安装过程中出现的undefined reference to OPENSSL_init_ssl报错需升级openssl依赖上传新版本依赖openssl-devel-1.0.2k-19.el7.x86_64.rpm至服务器,并执行安装:rpm -Uvh openssl-devel-1.0.2k-19.el7.x86_64.rpm #安装新版本依赖rpm -qa|grep openssl #查看依赖,确认已安装新版依赖亦可使用rpm -e卸载旧依赖再用rpm -ivh安装新版依赖。编译安装keepalived将keepalived的安装包 上传到/usr/local/software 目录下cd /usr/local/softwaretar -zxvf keepalived-2.2.0.tar.gzcd keepalived-2.2.0./configure --prefix=/usr/local/keepalivedmake && make install将 keepalived 安装成 Linux 系统服务安装完成之后, 需要做一些工作复制默认配置文件到 默认路径mkdir /etc/keepalivedcp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/cp /usr/local/keepalived/sbin/keepalived /usr/sbin/cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/cd /usr/local/software/keepalived-2.2.0cp ./keepalived/etc/init.d/keepalived /etc/init.d/chmod 755 /etc/init.d/keepalived编写nginx检测脚本新建脚本文件vi /etc/keepalived/nginx_check.sh内容如下:#!/bin/bashA=`ps -C nginx –no-header |wc -l`if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fifi赋予执行权限chmod +x /etc/keepalived/nginx_check.sh修改keepalived的Master配置文件vi /etc/keepalived/keepalived.conf内容如下:# 全局配置,配置收件人 global_defs { notification_email { ##通知机制,收件人 10000@qq.com } notification_email_from keepalived@domain.com ####发件人 smtp_server 192.168.1.100 ##发件服务器 smtp_connect_timeout 30 ##服务器连接超时时间 router_id LVS_DEVEL ##路由器标志 } # 集群资源监控,组合track_script进行 vrrp_script check_haproxy { script "/etc/keepalived/nginx_check.sh" #检测 nginx 状态的脚本路径 interval 2 #检测时间间隔 weight -20 #条件成立 权重减20} vrrp_instance HAPROXY_HA { # 设置当前主机为主节点,如果是备用节点,则设置为BACKUP state MASTER # 指定HA监测网络接口,可以用ifconfig查看来决定设置哪一个 interface eth0 # 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机 virtual_router_id 80 # 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文 如果VRRP组播没问题,以下这块的内容可以注释掉。 # 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了MASTER,并且绑定了VIP # 主节点时,内容为: #unicast_src_ip 192.168.1.100 # unicast_peer { # 192.168.1.101 #} # 设置优先级,确保主节点的优先级高过备用节点 priority 100 # 用于设定主备节点间同步检查时间间隔 advert_int 2 # 设置高可用集群中不抢占功能,在主机down后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患 #nopreempt # 设置主备节点间的通信验证类型及密码,同一个VRRP实例中需一致 authentication { auth_type PASS auth_pass 1234 } # 集群资源监控,组合vrrp_script进行 track_script { check_haproxy } # 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中 # 当状态切换到BACKUP时,此IP会自动从系统中删除 # 可以通过命令ip add查看切换后的状态 virtual_ipaddress { 192.168.1.102 #虚拟ip配置完之后就用它访问 } }修改keepalived的BACKUP配置文件# 全局配置,配置收件人 global_defs { notification_email { ##通知机制,收件人 10000@qq.com } notification_email_from keepalived@domain.com ####发件人 smtp_server 192.168.1.100 ##发件服务器 smtp_connect_timeout 30 ##服务器连接超时时间 router_id LVS_DEVEL ##路由器标志 } # 集群资源监控,组合track_script进行 vrrp_script check_haproxy { script "/etc/keepalived/nginx_check.sh" #检测 nginx 状态的脚本路径 interval 2 #检测时间间隔 weight -20 #条件成立 权重减20}vrrp_instance HAPROXY_HA { # 设置当前主机为主节点,如果是备用节点,则设置为BACKUP state BACKUP # 指定HA监测网络接口,可以用ifconfig查看来决定设置哪一个 interface eth0 # 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机 virtual_router_id 80 # 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文 如果VRRP组播没问题,以下这块的内容可以注释掉。 # 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了MASTER,并且绑定了VIP # 主节点时,内容为: #unicast_src_ip 192.168.1.101 # unicast_peer { # 192.168.1.100 #} # 设置优先级,确保主节点的优先级高过备用节点 priority 90 # 用于设定主备节点间同步检查时间间隔 advert_int 2 # 设置高可用集群中不抢占功能,在主机down后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患 nopreempt # 设置主备节点间的通信验证类型及密码,同一个VRRP实例中需一致 authentication { auth_type PASS auth_pass 1234 } # 集群资源监控,组合vrrp_script进行 track_script { check_haproxy } # 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中 # 当状态切换到BACKUP时,此IP会自动从系统中删除 # 可以通过命令ip add查看切换后的状态 virtual_ipaddress { 192.168.1.102 #虚拟ip配置完之后就用它访问 } }测试高可用第一步:启动nginx和keepalived服务启动nginx:#启动/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf/usr/local/nginx/sbin/nginx#停止/usr/local/nginx/sbin/nginx -s stopkillall nginx#重载/usr/local/nginx/sbin/nginx -s reload启动keepalived:#启动systemctl start keepalived#停止systemctl stop keepalivedkillall keepalived#重启systemctl restart keepalived启动之后,使用ip addr(centos6之前版本使用 ifconfig) 其中一台服务器会出现虚拟ip绑定到网卡第二步:通过虚拟ip访问服务通过虚拟ip访问服务,会跳转到nginx的服务上。第三步:杀掉一台服务器上的keepalived再次访问服务注意:杀掉nginx是不行的,因为上面的脚本 是检测到nginx宕机 会重启nginx的,例如这里杀死192.168.1.101上的keepalived进程。第四步:再次访问服务会发现虚拟ip 从192.168.1.101上取消了,重新绑定到192.168.1.100上了。查看日志tail -f /var/log/messages查询安装位置find / -name svnservewhereis svnserve

java编程之java jwt token使用autho0-jwt框架使用(二)

一、前言Java编程中使用jwt,首先你必须了解jwt是什么,长什么样子。如果你不了解可以先去本站另外一篇博客什么是JWT?二、Java编程中jwt框架选择在Java编程中,实现jwt标准的有很多框架,本博客采用的框架是auth0的java-jwt版本为3.2.0三、什么是Java-JWTauth0的java-jwt是一个JSON WEB TOKEN(JWT)的一个实现。四、安装下载相关依赖如果你是采用maven的方式,在你的项目pom.xml文件中添加以下java-jwt的依赖片段:<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.2.0</version></dependency>如果你是采用Gradle的方式,则添加以下内容:compile 'com.auth0:java-jwt:3.2.0'五、java-jwt已经实现的算法该库使用以下算法实现JWT验证和签名:JWS算法介绍HS256HMAC256HMAC with SHA-256HS384HMAC512HMAC with SHA-384HS512HMAC512HMAC with SHA-512RS256RSA256RSASSA-PKCS1-v1_5 with SHA-256RS384RSA384RSASSA-PKCS1-v1_5 with SHA-384RS512RSA512RSASSA-PKCS1-v1_5 with SHA-512ES256ECDSA256ECDSA with curve P-256 and SHA-256ES384ECDSA384ECDSA384 ECDSA with curve P-384 and SHA-384ES512ECDSA512ECDSA512 ECDSA with curve P-521 and SHA-512六、如何使用java-jwt6.1.选择一种算法 算法定义了一个令牌是如何被签名和验证的。它可以用HMAC算法的原始值来实例化,也可以在RSA和ECDSA算法的情况下对密钥对或密钥提供程序进行实例化。创建后,该实例可用于令牌签名和验证操作。在使用RSA或ECDSA算法时,只需要签署JWTs,就可以通过传递null值来避免指定公钥。当您需要验证JWTs时,也可以使用私钥进行操作使用静态的字符密文或者key来获取算法器://HMACAlgorithm algorithmHS = Algorithm.HMAC256("secret");//RSARSAPublicKey publicKey = //Get the key instanceRSAPrivateKey privateKey = //Get the key instanceAlgorithm algorithmRS = Algorithm.RSA256(publicKey, privateKey);使用一个key提供者来获取算法: 通过使用KeyProvider,您可以在运行时更改密钥,用于验证令牌签名或为RSA或ECDSA算法签署一个新的令牌。这是通过实现RSAKeyProvider或ECDSAKeyProvider方法实现的:getPublicKeyById(String kid): 它在令牌签名验证中调用,它应该返回用于验证令牌的密钥。如果使用了关键的轮换,例如JWK,它可以使用id来获取正确的轮换键(或者只是一直返回相同的键)。getPrivateKey(): 在令牌签名期间调用它,它应该返回用于签署JWT的密钥。getPrivateKeyId():在令牌签名期间调用它,它应该返回标识由getPrivateKey()返回的键的id的id。这个值比JWTCreator.Builder和keyid(String)方法中的值更受欢迎。如果您不需要设置孩子的值,就避免使用KeyProvider实例化算法。下面的代码片段将展示如何使用:final JwkStore jwkStore = new JwkStore("{JWKS_FILE_HOST}");final RSAPrivateKey privateKey = //Get the key instancefinal String privateKeyId = //Create an Id for the above keyRSAKeyProvider keyProvider = new RSAKeyProvider() { @Override public RSAPublicKey getPublicKeyById(String kid) { //Received 'kid' value might be null if it wasn't defined in the Token's header RSAPublicKey publicKey = jwkStore.get(kid); return (RSAPublicKey) publicKey; } @Override public RSAPrivateKey getPrivateKey() { return privateKey; } @Override public String getPrivateKeyId() { return privateKeyId; }};Algorithm algorithm = Algorithm.RSA256(keyProvider);//Use the Algorithm to create and verify JWTs.提示:对于使用JWKs的简单的键轮换,可以尝试JWKs-rsa-java库。6.2.创建一个签名的JWT token首先需要通过调用jwt.create()创建一个JWTCreator实例例如使用 HS256算法:try { Algorithm algorithm = Algorithm.HMAC256("secret"); String token = JWT.create() .withIssuer("auth0") .sign(algorithm);} catch (UnsupportedEncodingException exception){ //UTF-8 encoding not supported} catch (JWTCreationException exception){ //Invalid Signing configuration / Couldn't convert Claims.}例如使用RS256算法:RSAPublicKey publicKey = //Get the key instanceRSAPrivateKey privateKey = //Get the key instancetry { Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey); String token = JWT.create() .withIssuer("auth0") .sign(algorithm);} catch (JWTCreationException exception){ //Invalid Signing configuration / Couldn't convert Claims.}如果Claim不能转换为JSON,或者在签名过程中使用的密钥无效,那么将会抛出JWTCreationException异常。6.3.验证令牌 首先需要通过调用jwt.require()和传递算法实例来创建一个JWTVerifier实例。如果您要求令牌具有特定的Claim值,请使用构建器来定义它们。方法build()返回的实例是可重用的,因此您可以定义一次,并使用它来验证不同的标记。最后调用verifier.verify()来验证token例如使用 HS256算法的时候:String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";try { Algorithm algorithm = Algorithm.HMAC256("secret"); JWTVerifier verifier = JWT.require(algorithm) .withIssuer("auth0") .build(); //Reusable verifier instance DecodedJWT jwt = verifier.verify(token);} catch (UnsupportedEncodingException exception){ //UTF-8 encoding not supported} catch (JWTVerificationException exception){ //Invalid signature/claims}例如使用 RS256算法的时候:String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";RSAPublicKey publicKey = //Get the key instanceRSAPrivateKey privateKey = //Get the key instancetry { Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey); JWTVerifier verifier = JWT.require(algorithm) .withIssuer("auth0") .build(); //Reusable verifier instance DecodedJWT jwt = verifier.verify(token);} catch (JWTVerificationException exception){ //Invalid signature/claims}如果令牌有一个无效的签名,或者没有满足Claim要求,那么将会抛出JWTVerificationException异常6.4.jwt时间的验证JWT令牌可能包括可用于验证的DateNumber字段:这个令牌发布了一个过期的时间 “iat” < TODAY这个令牌还没过期 “exp” > TODAY and这个令牌已经被使用了. “nbf” > TODAY当验证一个令牌时,时间验证会自动发生,导致在值无效时抛出一个JWTVerificationException。如果前面的任何一个字段都丢失了,那么在这个验证中就不会考虑这些字段。要指定令牌仍然被认为有效的余地窗口,在JWTVerifier builder中使用accept回旋()方法,并传递一个正值的秒值。这适用于上面列出的每一项。JWTVerifier verifier = JWT.require(algorithm) .acceptLeeway(1) // 1 sec for nbf, iat and exp .build();您还可以为给定的日期声明指定一个自定义值,并为该声明覆盖缺省值。JWTVerifier verifier = JWT.require(algorithm) .acceptLeeway(1) //1 sec for nbf and iat .acceptExpiresAt(5) //5 secs for exp .build();如果您需要在您的lib/app中测试此行为,将验证实例转换为basever可视化,以获得verific.build()方法的可见性,该方法可以接受定制的时钟。例如:BaseVerification verification = (BaseVerification) JWT.require(algorithm) .acceptLeeway(1) .acceptExpiresAt(5);Clock clock = new CustomClock(); //Must implement Clock interfaceJWTVerifier verifier = verification.build(clock);6.5解码一个jwt令牌String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";try { DecodedJWT jwt = JWT.decode(token);} catch (JWTDecodeException exception){ //Invalid token}如果令牌有无效的语法,或者消息头或有效负载不是JSONs,那么将会抛出JWTDecodeException异常。6.6JWT头部解析Algorithm (“alg”)返回jwt的算法值或,如果没有定义则返回nullString algorithm = jwt.getAlgorithm();Type (“typ”)返回jwt的类型值,如果没有定义则返回null(多数情况类型值为jwt)String type = jwt.getType();Content Type (“cty”)返回内容的类型,如果没有定义则返回nullString contentType = jwt.getContentType();Key Id (“kid”)返回key的id值,如果没有定义则返回nullString keyId = jwt.getKeyId();私有的Claims,即自定义字段在令牌的头部中定义的附加声明可以通过调用getHeaderClaim() 获取,即使无法找到,也会返回。您可以通过调用claim.isNull()来检查声明的值是否为null。Claim claim = jwt.getHeaderClaim("owner");当使用jwt.create()创建一个令牌时,您可以通过调用withHeader()来指定头声明,并同时传递声明的映射。Map<String, Object> headerClaims = new HashMap();headerClaims.put("owner", "auth0");String token = JWT.create() .withHeader(headerClaims) .sign(algorithm);提示:在签名过程之后,alg和typ值将始终包含在Header中。6.7JWT的负载(Payload)声明Issuer (“iss”)返回签发者的名称值,如果没有在负载中定义则返回nullString issuer = jwt.getIssuer();Subject ("sub")返回jwt所面向的用户的值,如果没有在负载中定义则返回nullString subject = jwt.getSubject();Audience ("aud")返回该jwt由谁接收,如果没有在负载中定义则返回nullList<String> audience = jwt.getAudience();Expiration Time ("exp")返回该jwt的过期时间,如果在负载中没有定义则返回nullDate expiresAt = jwt.getExpiresAt();Not Before ("nbf")Returns the Not Before value or null if it’s not defined in the Payload.Date notBefore = jwt.getNotBefore();Issued At ("iat")返回在什么时候签发的,如果在负载中没有定义则返回nullDate issuedAt = jwt.getIssuedAt();JWT ID ("jti")返回该jwt的唯一标志,如果在负载中没有定义则返回nullString id = jwt.getId();自定义声明在令牌有效负载中定义的附加声明可以通过调用getClaims()或 getClaim()和传递声明名来获得。即使无法找到声明,也将会有返回值。您可以通过调用claim.isNull()来检查声明的值是否为null。Map<String, Claim> claims = jwt.getClaims(); //Key is the Claim nameClaim claim = claims.get("isAdmin");或者:Claim claim = jwt.getClaim("isAdmin");当使用jwt.create()创建一个令牌时,您可以通过调用withClaim()来指定自定义声明,并同时传递名称和值。String token = JWT.create() .withClaim("name", 123) .withArrayClaim("array", new Integer[]{1, 2, 3}) .sign(algorithm);您还可以通过调用withClaim()来验证jwt.require()的自定义声明,并传递该名称和所需的值。JWTVerifier verifier = JWT.require(algorithm) .withClaim("name", 123) .withArrayClaim("array", 1, 2, 3) .build();DecodedJWT jwt = verifier.verify("my.jwt.token");提示:当前支持的自定义JWT声明创建和验证的类型是:Boolean, Integer, Double, String, Date 和Arrays。6.8Claim Class索赔类是索赔值的包装器。它允许您将索赔作为不同的类类型。可用的工具方法:原始的:asBoolean(): 返回布尔值,如果不能转换返回null。asInt(): 返回整数值,如果不能转换返回null。asDouble(): 返回 Double 值,如果不能转换则返回null。asLong(): 返回Long 值,如果不能转换则返回null。asString(): 返回String值,如果不能转换则返回null。asDate(): 返回 Date值,如果不能转换则返回null。 必须是一个数字日期 (Unix 系统时间戳). 注意,JWT标准指定所有的数字日期值必须以秒为单位。自定义类型和集合:要获得作为集合的声明,您需要提供要转换的内容的类类型as(class): 返回 Class Type 的解析值. 对于集合,您应该使用asArray和asList方法。asMap(): 返回被转换为 Map<String, Object>的值asArray(class): 返回被转换成元素类型的 Class Type, or null if the value isn’t a JSON Array.asList(class): 返回集合元素的 Class Type, or null if the value isn’t a JSON Array.如果不能将值转换为给定的类类型,则会抛出JWTDecodeException异常

GitLab私有Git的安装与配置

GitLab私有Git1 GitLab简介GitLab是整个DevOps生命周期的第一个单一应用程序。只有GitLab才能启用Concurrent DevOps,从组件链的约束中解锁组织。GitLab提供无与伦比的可见性,更高的效率和全面的治理。这使得软件生命周期加快了200%,从根本上提高了业务速度。官方网站gitlab优势2 GitLab安装2.1 CentOS 7安装安装步骤:安装并配置必要的依赖项在CentOS 7(和RedHat / Oracle / Scientific Linux 7)上,以下命令还将在系统防火墙中打开HTTP和SSH访问。sudo yum install -y curl policycoreutils-python openssh-serversudo systemctl enable sshdsudo systemctl start sshdsudo firewall-cmd --permanent --add-service=httpsudo systemctl reload firewalld安装Postfix以发送通知电子邮件【可选】sudo yum install postfixsudo systemctl enable postfixsudo systemctl start postfix添加GitLab软件包存储库并安装软件包curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash接下来,安装GitLab包。将http:// gitlab.example.com更改为您要访问GitLab实例的URL。安装将自动配置并启动该URL的GitLab。HTTPS 在安装后需要其他配置sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce初始化配置时间比较久……,需要耐心等待….., 不要做任何操作gitlab-ctl reconfigure其他命令:# gitlab 服务操作 服务操作# 初始化配置 gitlabgitlab-ctl reconfigure# 启动 gitlab 服务gitlab-ctl start# 停止 gitlab 服务gitlab-ctl stop浏览到服务器IP并登录首次访问时,您将被重定向到密码重置屏幕。提供初始管理员帐户的密码,您将被重定向回登录屏幕。使用默认帐户的用户名root登录。==需要设置新的密码==2.2 Docker 安装拉取gitlab、redis、postgresql,gitlab依赖redis和postgresql。docker pull sameersbn/redisdocker pull sameersbn/postgresqldocker pull gitlab/gitlab-ce:latest创建postgresql、redis容器docker run --name postgresql -d ‐‐privileged=true -e 'DB_NAME=gitlabhq_production' -e'DB_USER=gitlab' -e 'DB_PASS=password' -e 'DB_EXTENSION=pg_trgm' -v/home/root/opt/postgresql/data:/var/lib/postgresql sameersbn/postgresqldocker run --name redis -d --privileged=true -v /home/root/opt/redis/data:/var/lib/redissameersbn/redis3.创建gitlab容器docker run --name gitlab -d --link postgresql:postgresql --link redis:redisio --hostname 192.168.101.64 -p 10022:22 -p 80:80 -e 'GITLAB_PORT=8899' -e 'GITLAB_SSH_PORT=10022' -e'GITLAB_SECRETS_DB_KEY_BASE=long‐and‐random‐alpha‐numeric‐string' -e'GITLAB_SECRETS_SECRET_KEY_BASE=long‐and‐random‐alpha‐numeric‐string' -e'GITLAB_SECRETS_OTP_KEY_BASE=long‐and‐random‐alpha‐numeric‐string' -e'GITLAB_HOST=192.168.101.64' ‐e 'SMTP_AUTHENTICATION=login' -v/home/root/opt/gitlab/data:/home/git/data docker.io/gitlab/gitlab-ce浏览器访问:http://[IP]:80初次访问需要等待一段时间。3 Idea集成GitLab在File => Settings => Plugins 里面 搜索 gitlab 安装,装好后点击File => Settings => Other Settings => GitLab Setting这里面主要配置GitLab Server Url和你个人的私有访问token

GitLab私有Git的安装与配置