Spring源码解析之BeanPostProcessor

Spring源码解析之BeanPostProcessor,第1张

源码版本4310-RELEASE

我们都知道,实现BeanPostProcessor接口,在bean初始化前后,spring会分别回调postProcessBeforeInitialization和postProcessAfterInitialization。目的是保留扩展接口修改bean的属性,甚至可以替换bean :

那spring究竟是如何做到的呢?我们一起来看看吧。

从spring容器启动开始看起:new ClassPathXmlApplicationContext("classpath:applicationxml");

看AbstractApplicationContextrefresh();方法。

1、在 obtainFreshBeanFactory 里会解析xml配置,把所有bean注册到beanDefinitionNames,包含我们自定义的BeanPostProcessor。

2、先看 prepareBeanFactory:

这里添加了三个spring默认的BeanPostProcessor。

3、再看 postProcessBeanFactory:

这个是AbstractRefreshableWebApplicationContext(AbstractApplicationContext的子类)的方法,它同样也添加了一个默认的BeanPostProcessor。

4、接着看 invokeBeanFactoryPostProcessors:

这里设置一下TempClassLoader,并重新添加LoadTimeWeaverAwareProcessor,后面会单独开个文章分析内建的这些类的作用。

5、继续看 registerBeanPostProcessors:

registerBeanPostProcessors 会继续添加一个内建Processor:

然后从容器取出所有Processor(包括我们自定义的)进行排序,再添加回beanFactory(先移除后添加),最后重新把ApplicationListenerDetector添加到末尾:

6、最后看一下调用过程吧, finishBeanFactoryInitialization:

在这里beanFactorypreInstantiateSingletons();(在子类DefaultListableBeanFactory里实现)

再到其父类的AbstractBeanFactorydoGetBean->AbstractAutowireCapableBeanFactory createBean ->resolveBeforeInstantiation

就是在这里回调接口的2个方法,其实这里允许直接返回bean了。继续看resolveBeforeInstantiation后面的 doCreateBean ,同样会在applyMergedBeanDefinitionPostProcessors里回调,不过只是针对某一类型的Processor:

doCreateBean 的另一个方法initializeBean里也会做回调:

执行完 createBean 后,再回到其父类的AbstractBeanFactory getObjectForBeanInstance (该方法就是处理FactoryBean类型的bean)

调到其父类FactoryBeanRegistrySupportgetObjectFromFactoryBean

到AbstractAutowireCapableBeanFactorypostProcessObjectFromFactoryBean(在doGetObjectFromFactoryBean后执行,该方法正是初始化bean的过程)->applyBeanPostProcessorsAfterInitialization

至此,完

在php中,表单POST提交的数据是存放在$_POST变量中$_POST变量是一个数组,它是一个以表单字段名作索引的数组比如有以下表单:

<form method="post">

    <p>姓名:<input type="text" name="name" value=""></p>

    <p>年龄:<input type="text" name="age" value=""></p>

    <p><input type="submit" value="提交"></p>

</form>

输入值后提交,按你的要求,在php层处理输出提交的内容,那么可以这样:

<php

echo '你的姓名是:'$_POST['name'];//其中$_POST['name']中存放的是上面表单名为name的值

echo '你今年'$_POST['age']'岁';//其中$_POST['age']中存放的是上面表单名为age的值

>

如果字段内容很多,有时就可能需要循环处理

foreach($_POST as $val){

    echo $val;

}

或直接:

print_r($_POST);

当然处理或输出的格式很多,以上只是一个示例

老规矩先用错误信息登陆一下抓一下包,看看有那些post字段:

大概我们就知道我们要分析的字段有nloginpwd其余字段还不清楚,就在上下在看看其他数据包,根据pubkey我们猜测加密方式大概是RSA,继续查看其他数据包,找到一个有价值的get包

信息是:

没有发现明确的关键字,但是可以猜想bg、challenge、patch应该和我们的加密参数相关,但是不确定,只有继续分析加密的js片段:

其中好几个字段都是$("#")格式,这种表示是来自页面的,那在看看网页源码

果然发现了很多有价值的东西在post表单中的,其中只有两个参数是需要单独获取的,其余都是从html源码里面解析出来的

authcode来源

是获取的源码中的一个值,再看源码

看样子是在验证码 *** 作的时候触发的一个请求,返回的authcode的值,查看authcode请求的数据包

这个请求看起来不是那么友好,有好几个疑似加密字段,这个参数暂时放放,继续分析我们的passWord的加密。

继续深入getEntryptPwd($('#nloginpwd')val()),查看源码

核心的就两行

encryptsetPublicKey(pubKey); return encryptencrypt(pwd);这必定是RSA加密无疑了,继续查看源码,单独的一个源码文件,一共3300多行,删减版如下

JSEncrypt是前端使用的实现RSA加密的库,看样子应该比较标准,那就试试能不能改写了,复制全部源码到nodejs,会提示navigator、window未定义,这个问题很简单,在文件头定义

var navigator = this;

var window = this

然后在文件尾部写个调用程序试试

是可以成功返回RSA加密结果的

京东的post请求不是太难,参数也能在源码中找到,但是他的难度在发出post请求之前的一个get请求,这个get请求和验证有关,和用户名相关,简单看了一下感觉有点复杂,留在第二篇讲获取authcode参数的其他参数是怎么来的。

ID:Python之战

|作|者|公(zhong)号:python之战

专注Python,专注于网络爬虫、RPA的学习-践行-总结

喜欢研究和分享技术瓶颈,欢迎关注

独学而无友,则孤陋而寡闻!

使用PostGIS提供的st_asmvt函数返回MapBox格式的矢量切片时,PostGIS报错 missing libprotobuf-c ,为了解决这个问题,需要从源码编译postgis,添加对protobuf的支持,特此记录。

通过yum安装postgresql10 ,安装目录/var/lib/pgsql/10

yum install -y gcc gcc-c++

以上就是关于Spring源码解析之BeanPostProcessor全部的内容,包括:Spring源码解析之BeanPostProcessor、php接收POST数据并循环输出的代码、京东post登陆参数js分析,密码加密的RSA加密实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9277535.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存