当前位置:   article > 正文

Spring IOC对象的模拟实现&避雷一个 dom4j BUG_dom4j漏洞

dom4j漏洞

1.框架搭建

2.POM文件配置

 3.Spring.xml简单配置

 4.具体代码

  1. package com.xyd.Spring;
  2. import org.dom4j.Document;
  3. import org.dom4j.Element;
  4. import org.dom4j.Node;
  5. import org.dom4j.XPath;
  6. import org.dom4j.io.SAXReader;
  7. import java.net.URL;
  8. import java.util.*;
  9. /**
  10. * 模拟Spring的实现
  11. * 1.通过带参构造器得到对应的配置文件
  12. * 2.通过我们的dom4j解析我们的xml文件 得到一个list集合 存放bean标签id和class 属性
  13. * 3.通过反射得到对应的实例化对象 遍历集合 通过过去对应的class属性 利用class.forName(class).newInstance
  14. * 4.通过id属性值 获取指定的实例化对象
  15. * 5.
  16. */
  17. public class MyClassPathXmlApplicationContext implements MyFactory {
  18. //private List<MyBean> beanList; //存放从配置文件中获取到的bean标签的信息 Mybean 代表的就是每一个bean标签
  19. List<MyBean> beanList = new ArrayList<>();
  20. //private Map<String, Object> beanMap = new HashMap<>();//存放实例化好的对象 通过id获取对应的对象
  21. Map<String, Object> beanMap = new HashMap<>();
  22. //1.通过带参构造器得到对应的配置文件
  23. public MyClassPathXmlApplicationContext(String fileName) {
  24. /*2.通过我们的dom4j解析我们的xml文件 得到一个list集合 存放bean标签id和class 属性*/
  25. this.parseXml(fileName);
  26. this.instanceBean();
  27. }
  28. /**
  29. * 通过dom4j 解析xml文件 得到list集合
  30. * 1.获取解析器
  31. * 2.获取文件的配置
  32. * 3.通过解析器解析配置文件
  33. * 4.通过xpath 语法解析 获取beans标签下的所有bean标签
  34. * 5.通过制定的解析语法 解析文档对象 返回元素集合
  35. * 6.判断元素集合是否为空
  36. * 7.判断元素结合不为空 遍历集合
  37. * 8.获取bean标签元素的属性 id h和class
  38. * 9.获取Mybean 对象 将id 和class 属性设置到对象中 再将对象设置到MyBean的集合中
  39. *
  40. * @param fileName
  41. */
  42. private void parseXml(String fileName) {
  43. //1.获取解析器
  44. SAXReader saxReader = new SAXReader();
  45. //2.获取配置文件的URL
  46. URL url = this.getClass().getClassLoader().getResource(fileName);
  47. try {
  48. //3.通过解析器 配置文件 xml
  49. Document document = saxReader.read(url);
  50. //4.通过xpath 语法解析 获取beans标签下的所有bean标签
  51. XPath xPath = document.createXPath("beans/bean");
  52. //5.通过制定的解析语法 解析文档对象 返回元素集合
  53. /* dom4j由1.6.1更新到2.1.3后,List<Node>无法自动转换为List<Element>,因此需要在遍历时将List中的Node元素单独转换为Element*/
  54. //List<Element> elementList = xPath.selectNodes(document);
  55. List<Node> selectList = xPath.selectNodes(document);
  56. if (selectList != null && selectList.size() > 0) {
  57. for (Node node : selectList) {
  58. //8.获取bean标签元素的属性 id h和class
  59. Element selectElement = (Element) node;
  60. //取出id属性的值
  61. String id = selectElement.attributeValue("id");
  62. String aClass = selectElement.attributeValue("class");
  63. //9.获取Mybean 对象 将id 和class 属性设置到对象中 再将对象设置到MyBean的集合中
  64. MyBean myBean = new MyBean();
  65. myBean.setId(id);
  66. myBean.setClazz(aClass);
  67. beanList.add(myBean);
  68. }
  69. }
  70. // // 6.判断元素集合是否为空
  71. // if (elementList != null && elementList.size() > 0) {
  72. // //实例化
  73. // beanList = new ArrayList<>();
  74. // //7.判断元素结合不为空 遍历集合
  75. // for (Element node : elementList) {
  76. // //8.获取bean标签元素的属性 id h和class
  77. // String id = node.attributeValue("id");
  78. // String aClass = node.attributeValue("class");
  79. // //9.获取Mybean 对象 将id 和class 属性设置到对象中 再将对象设置到MyBean的集合中
  80. // MyBean myBean = new MyBean(id, aClass);
  81. // beanList.add(myBean);
  82. // }
  83. // }
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. /**
  89. * 通过反射得到对应的实例化对象 防止Map对象
  90. * 1.判断对象集合是否为空 如果不为空 则遍历集合获取对象id
  91. * 2.通过类的全路径 反射得到实例化对象
  92. * 3.将对应的id和实例化的bean 对象设置到Map 对象中
  93. */
  94. private void instanceBean() {
  95. //1.判断对象集合是否为空 如果不为空 则遍历基金和 获取对象id
  96. if (beanList != null && beanList.size() > 0) {
  97. for (MyBean bean : beanList) {
  98. String id = bean.getId();
  99. String clazz = bean.getClazz();
  100. try {
  101. //2.通过类的全路径 反射得到实例化对象
  102. Object o = Class.forName(clazz).newInstance();
  103. //3.将对应的id和实例化的bean 对象设置到Map 对象中
  104. beanMap.put(id, o);
  105. } catch (Exception e) {
  106. e.printStackTrace();
  107. }
  108. }
  109. }
  110. }
  111. /**
  112. * 通过id 获取对应的Map 对象中的value
  113. *
  114. * @param id
  115. * @return
  116. */
  117. @Override
  118. public Object getBean(String id) {
  119. Object object = beanMap.get(id);
  120. return object;
  121. }
  122. }

5.避雷BUG【dom4j 不兼容的类型】

 编译时报的错误:dom4j 不兼容的类型: java.util.List<org.dom4j.Node>无法转换为java.util.List<org.dom4j.Element>

6.解决方法:

 在遍历时将List中的Node元素单独转换为Element

7.启动类

  1. package com.xyd;
  2. import com.xyd.Service.UserService;
  3. import com.xyd.Spring.MyClassPathXmlApplicationContext;
  4. import com.xyd.Spring.MyFactory;
  5. import com.xyd.Dao.UserDao;
  6. /**
  7. * Hello world!
  8. */
  9. public class App {
  10. public static void main(String[] args) {
  11. //得到工厂的实现对象
  12. MyFactory factory = new MyClassPathXmlApplicationContext("spring.xml");
  13. //得到对应的实例化对象
  14. UserDao userDao = (UserDao) factory.getBean("userDao");
  15. userDao.test();
  16. UserService userService = (UserService) factory.getBean("userService");
  17. userService.test();
  18. }
  19. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号