源码版本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层处理输出提交的内容,那么可以这样:
<phpecho '你的姓名是:'$_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加密实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)