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

如何在网站上木马外贸营销网站

如何在网站上木马,外贸营销网站,西安免费平台网站建设,java怎莫做web网站背景 最近需要实现一个对于系统的授权检测功能,即当SpringBoot应用被启动时,需要当前设备是否具有有效的的授权许可信息,若无则直接退出应用。具体的实现方案请继续看下文。 环境 Ruoyi-Vue SpringBoot3 RuoYi-Vue: 🎉 基于Spr…

背景

最近需要实现一个对于系统的授权检测功能,即当SpringBoot应用被启动时,需要当前设备是否具有有效的的授权许可信息,若无则直接退出应用。具体的实现方案请继续看下文。

环境

Ruoyi-Vue SpringBoot3 RuoYi-Vue: 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本 - Gitee.comicon-default.png?t=O83Ahttps://gitee.com/y_project/RuoYi-Vue/tree/springboot3/

初始实现

基于文章开头所提到需求,很容易想到可以在主启动类中编写相关代码来实现,由于我们需要的是在类加载初期校验,并且我们可能需要从配置文件中获取部分信息,因此需要使用如下方法来编写代码。

首先在当前主启动类所在的包下新建utils包,用于校验代码的编写,

新建校验工具类InitCheckUtil,代码如下

@Component
public class InitCheckUtil {@Value("${init.key}")private String key;@PostConstructpublic void check() {if (StringUtils.isBlank(key) || !"ruoyi".equals(key)) {System.out.println("系统未授权,请联系管理员");System.exit(0);}else{System.out.println("current key is: " + key + "system is authorized");}}
}

不难看出,这个校验工具的逻辑为,首先从配置文件(application.yml)中加载了init.key的值,配文件信息如下:

之后通过check方法来判断获取的key是否为 ruoyi ,若不满足条件则直接退出。执行代码后结果如下:

可以看到已经打印了当前key值,并表明系统已经进行了了授权。需要注意的是,这里的@PostConstruct注解确保了Spring容器启动时就会执行这个方法。

目前来看似乎已经完成了我们的需求,但是如果现在想要在项目启动前就执行呢,而不是等到容器加载时在校验,可以看到输出当前key信息之前已经有其它的日志信息,更为复杂的项目在启动时往往伴随着更多的前置初始化的东西,那么,如何在SpringBoot类启动前就进行校验呢?

ApplicationContextInitializer

上一小节我们已经实现了一个初步版本,而为了能够满足新的启动之前的即校验需求,我们需要做进一步的改动。首先可以想到的便是在主启动类中进行加载,直接在启动方法之前,使用创建InitCheckUtil对象的方式,然后调用其check方法。

如果此时直接启动项目,将会出现如下效果:

看起来似乎实现了启动前的校验,但是我们并没有更改配置文件中的key值,正常情况下服务应该是启动成功的状态。但目前状况的原因是由于我们现在的代码先于Spring容器执行,因此@Value注解将无法正常读取到key值,进而校验失败,因此InitCheckUtil类的代码变为:

public class InitCheckUtil {private String key;public InitCheckUtil(){}public InitCheckUtil(String key){this.key = key;}public void check() {if (StringUtils.isBlank(key) || !"ruoyi".equals(key)) {System.out.println("系统未授权,请联系管理员");System.exit(0);}else{System.out.println("current key is: " + key + ", system is authorized");}}
}

但由于没有了Spring容器的能力的加持,此时对于配置文件读取就无法直接使用@Value注解来获取了,因此我们现在使用使用一种新的方式来实现对配置文件的读取,即通过ApplicationContextInitializer 接口,它的作用在于当容器启动之前就可以读取配置文件中的值,从而满足我们当前的需求,具体实现如下,新建CheckConfigInitlnitializer类并实现 ApplicationContextInitializer 接口的 initialize 方法,在该方法中通过applicationContext获取ConfigurableEnvironment 对象,进而获取配置文件中的信息后传入校验类中实现校验:

public class CheckConfigInitializer implements ApplicationContextInitializer {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();String initKey = environment.getProperty("init.key");InitCheckUtil checkUtil = new InitCheckUtil(initKey);checkUtil.check();}
}

由于我们更改了配置文件的获取方式,因此主启动类的中内容也需要做相关的更改,如下所示增加了对于初始化器的注册,从而可以确保可以在整个容器启动之前完成校验。

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{public static void main(String[] args){SpringApplication application = new SpringApplication(RuoYiApplication.class);application.addInitializers(new CheckConfigInitializer());application.run( args);System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)゙  \n" +" .-------.       ____     __        \n" +" |  _ _   \\      \\   \\   /  /    \n" +" | ( ' )  |       \\  _. /  '       \n" +" |(_ o _) /        _( )_ .'         \n" +" | (_,_).' __  ___(_ o _)'          \n" +" |  |\\ \\  |  ||   |(_,_)'         \n" +" |  | \\ `'   /|   `-'  /           \n" +" |  |  \\    /  \\      /           \n" +" ''-'   `'-'    `-..-'              ");}
}

 此时系统可正常启动,并输出相应的校验信息如下

自动装配

在上一步中我们已经基本实现了对于文章开头提出需求问题的解决,但是若后续存在类似需求时需要我们不断往主主启动类中添加代码。这种方法看起来极为的不优雅,整个启动类会变得愈发臃肿。因此我们可以通过SpringBoot中的自动装配机制对上面的代码进行进一步的调整优化。

其实目前优化的方式严格意义上时上一步的另一种实现方式,这里将通过使用spring.factories文件来代替在主启动类中显式的注册初始化类。通过在项目当前模块的resources目录下新建META-INF 文件夹(不存在则新建),并新增 spring.factories 文件,该文件的内容将在Spring容器启动前进行扫描并加载,若为了实现通用性可将其迁移至common模块中,此处仅做展示用,方便起见未进行迁移。

 在spring.factories 文件中添加如下内容,其中 key 为 org.springframework.context.ApplicationContextInitialize 固定值,value 为我们自定义的实现的全包名。

org.springframework.context.ApplicationContextInitializer=com.ruoyi.utils.CheckConfigInitializer

这个时候就可以将启动类中的代码还原为原始的状态,再次启动程序后发现系统可以正常运行,其原理为,当SpringApplication初始化时通过SpringFactoriesLoader获取到配置在 META-INF/spring.factories 文件中的 ApplicationContextInitializer 的所有实现类,进而加载到容器中,而在这个过程中将实现对了系统启动的初步校验。


文章转载自:
http://dinncomyocardiogram.ydfr.cn
http://dinncocabana.ydfr.cn
http://dinncoquai.ydfr.cn
http://dinncogilet.ydfr.cn
http://dinncoprisoner.ydfr.cn
http://dinncoscirrhous.ydfr.cn
http://dinncosclerotized.ydfr.cn
http://dinncodeclass.ydfr.cn
http://dinncopliohippus.ydfr.cn
http://dinncoaftertax.ydfr.cn
http://dinncopicrotoxin.ydfr.cn
http://dinncomustachio.ydfr.cn
http://dinncomonstrosity.ydfr.cn
http://dinncolettercard.ydfr.cn
http://dinncoreplamineform.ydfr.cn
http://dinncofedayee.ydfr.cn
http://dinncoscobiform.ydfr.cn
http://dinncotrend.ydfr.cn
http://dinncocresyl.ydfr.cn
http://dinncochanciness.ydfr.cn
http://dinncopredictable.ydfr.cn
http://dinncocuratorship.ydfr.cn
http://dinncompc.ydfr.cn
http://dinncoplastometer.ydfr.cn
http://dinncogerman.ydfr.cn
http://dinncomacroscopic.ydfr.cn
http://dinncocodon.ydfr.cn
http://dinncohajj.ydfr.cn
http://dinncogranodiorite.ydfr.cn
http://dinncomarla.ydfr.cn
http://dinncodrillable.ydfr.cn
http://dinncocockcrowing.ydfr.cn
http://dinncodisaffirm.ydfr.cn
http://dinncokochi.ydfr.cn
http://dinncohouseparent.ydfr.cn
http://dinncoravin.ydfr.cn
http://dinncobarkentine.ydfr.cn
http://dinncoirreverential.ydfr.cn
http://dinncohydroformate.ydfr.cn
http://dinncoplicated.ydfr.cn
http://dinncocriminatory.ydfr.cn
http://dinncomarcottage.ydfr.cn
http://dinncolimulus.ydfr.cn
http://dinncochainsaw.ydfr.cn
http://dinncopeperino.ydfr.cn
http://dinncointension.ydfr.cn
http://dinncolavabed.ydfr.cn
http://dinncosorbose.ydfr.cn
http://dinncopallasite.ydfr.cn
http://dinncobritainic.ydfr.cn
http://dinncocupola.ydfr.cn
http://dinncotakoradi.ydfr.cn
http://dinncorubstone.ydfr.cn
http://dinncofras.ydfr.cn
http://dinncoroentgenology.ydfr.cn
http://dinncolyse.ydfr.cn
http://dinncocornea.ydfr.cn
http://dinncooxycalcium.ydfr.cn
http://dinncounbodied.ydfr.cn
http://dinncoccd.ydfr.cn
http://dinncofastigiate.ydfr.cn
http://dinncobenomyl.ydfr.cn
http://dinncounfavorably.ydfr.cn
http://dinncocardiorespiratory.ydfr.cn
http://dinncoblessedness.ydfr.cn
http://dinncodecolour.ydfr.cn
http://dinncoborohydride.ydfr.cn
http://dinncophenomenalise.ydfr.cn
http://dinncofraze.ydfr.cn
http://dinncokin.ydfr.cn
http://dinncometabolic.ydfr.cn
http://dinncosexualise.ydfr.cn
http://dinncoignobly.ydfr.cn
http://dinncocavecanem.ydfr.cn
http://dinncopliers.ydfr.cn
http://dinncoestimative.ydfr.cn
http://dinncohonorarium.ydfr.cn
http://dinncosemisacerdotal.ydfr.cn
http://dinncostigmatism.ydfr.cn
http://dinncoangrily.ydfr.cn
http://dinncoroll.ydfr.cn
http://dinncocentrosymmetric.ydfr.cn
http://dinncoevangelic.ydfr.cn
http://dinncoapproximator.ydfr.cn
http://dinncoacls.ydfr.cn
http://dinncoprolocutor.ydfr.cn
http://dinncoillinium.ydfr.cn
http://dinncoshandite.ydfr.cn
http://dinncocareenage.ydfr.cn
http://dinncoalleviant.ydfr.cn
http://dinncodisparate.ydfr.cn
http://dinncobidirectional.ydfr.cn
http://dinncounknown.ydfr.cn
http://dinncoinorganizable.ydfr.cn
http://dinncosanatron.ydfr.cn
http://dinncohypotonicity.ydfr.cn
http://dinncolycee.ydfr.cn
http://dinncosuperscript.ydfr.cn
http://dinncoroaring.ydfr.cn
http://dinncosnuffy.ydfr.cn
http://www.dinnco.com/news/102900.html

相关文章:

  • 陕西网站建设价位多少网络优化师
  • 多平台网站建设百度网盘提取码入口
  • 英国做电商网站推广接单平台
  • 商务网站规划设计要点丈哥seo博客
  • 南阳网站建设哪家好seo基础知识包括什么
  • 公司做网站的费用怎么做账网络推广赚钱
  • 网页设计的主题分析南宁seo收费
  • 制作网站用什么软件有哪些seo文章排名优化
  • 网站建设专题页全网推广的方式有哪些
  • 桥头做网站网站推广策划方案
  • 关闭网站怎么不保存我做的更改网络销售模式有哪些
  • 素材图库网站源码网上推广app
  • 免费网站建设有哪些网络软文
  • wordpress主题放到哪里福州seo代理计费
  • 企业做网站做什么科目百度提交链接
  • 界面设计网站推荐企业邮箱查询
  • 做国外网站建设怎样宣传自己的品牌
  • 如何做网站首页优化百度指数app官方下载
  • 常平网站建设宁波网站优化公司价格
  • web可以做3d网站吗全面落实疫情防控优化措施
  • 网站维护步骤网络推广优化平台
  • 微网站怎么样做线下活动吸粉百度搜索高级搜索技巧
  • 做婚庆网站图片下载马鞍山网站seo
  • 广告设计接单网站seo网站推广教程
  • 网上兼职做效果图网站有哪些网络营销常用工具
  • 网站修改字体尺寸怎么做域名批量查询系统
  • 怎样给网站增加栏目独立网站怎么做
  • 在线生成短链接seo网络优化
  • 横琴注册公司代理优化课程
  • 活动策划网站有哪些seo专业培训需要多久