servlet injection analysis
一、 Spring不能通过注解向Servlet中注入实例的原理
想了解此问题的原理,就要了解tomcat启动后 servlet和spring的加载顺讯。
1、 tomcat启动后先加载web.xml文件。web.xml主要配置了servlet 、filter、listenner三种javaee规范的类,加载顺序跟在web.xml文档中的位置无关。
顺序为 listenner>filter>servlet 。
2、而spring的初始化类为org.springframework.web.context.ContextLoaderListener,就是一个listenner,它是先于servlet加载的。普通servlet和springmvc的入口servlet
的加载顺序,就要看servle的设置了。
3、在 servlet A类上加@service或@controllert等注解时,spring或springmvc会扫面相关包,自动实例化一个servlet 实例A;这个实例A的引用是spring容器管理的。
4、当然 servlet也会在web.xml配置(要不然怎么拦截url),这是tomcat容器会根据servler配置启动时或者第一次请求该url时实例化该servlet 实例B,
这个实例B的引用是tomcat容器管理的。
5、明白了吧,拦截url的servlet和spring依赖注入的servlet不是同一个实例!!所以就产生了不能依赖注入或者注解不起作用的现象。
二、解决办法
1、第一种,如果在servlet里需要用到一个testservice,不需要在testservice上注解@Autowired,可以简单的用spring硬编码的形式获得。
在你自定义的servlet的 重写方法init中加入如下代码(servlet类需要继承javax.servlet.http.HttpServlet 类)
public void init() throws ServletException {
WebApplicationContext appCtx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
captchaService = (ImageCaptchaService) BeanFactoryUtils.beanOfTypeIncludingAncestors(appCtx, ImageCaptchaService.class);
session = (SessionProvider) BeanFactoryUtils.beanOfTypeIncludingAncestors(appCtx, SessionProvider.class);
}
servlet injection analysis的更多相关文章
- 剖析servlet injection及源码分析.
@WebServlet("/cdiservlet") public class NewServlet extends HttpServlet { private Message m ...
- 分析servlet injection
@WebServlet("/cdiservlet") ||url映射 public class NewServlet extends HttpServlet { private M ...
- servlet cdi analysis
CDI中最令人兴奋的功能是允许每个人在Java EE平台中编写强大的扩展性功能,甚至于改变其核心本身.这些扩展性功能是可以完全移植到任何支持CDI的环境中. CDI的一些主要特性 1.类型安全:CDI ...
- Servlet基本知识
Servlet基本知识 1.IDEA创建第一个Servlet程序xing 这里说明如何使用 IDEA Ultimate 2020.1.3版本来新建第一个web程序.参考 MoonChasing 1.1 ...
- Cognos报表打开参数
查看门户页面 http://localhost:9300/p2pd/servlet/dispatch? b_action=xts.run &m=portal/cc.xts &gohom ...
- web全套资料 干货满满 各种文章详解
sql注入l MySqlMySQL False注入及技巧总结MySQL 注入攻击与防御sql注入学习总结SQL注入防御与绕过的几种姿势MySQL偏门技巧mysql注入可报错时爆表名.字段名.库名高级S ...
- ref:web security最新学习资料收集
ref:https://chybeta.github.io/2017/08/19/Web-Security-Learning/ ref:https://github.com/CHYbeta/Web-S ...
- Web-Security-Learning
Web Security sql注入 MySql MySQL False 注入及技巧总结 MySQL 注入攻击与防御 sql注入学习总结 SQL注入防御与绕过的几种姿势 MySQL偏门技巧 mysql ...
- CVE: 2014-6271、CVE: 2014-7169 Bash Specially-crafted Environment Variables Code Injection Vulnerability Analysis
目录 . 漏洞的起因 . 漏洞原理分析 . 漏洞的影响范围 . 漏洞的利用场景 . 漏洞的POC.测试方法 . 漏洞的修复Patch情况 . 如何避免此类漏洞继续出现 1. 漏洞的起因 为了理解这个漏 ...
随机推荐
- Android的TextView设置padding无效
I finally found the problem I have to set the background first before setting the padding. Setting t ...
- An error occurred. Sorry, the page you are looking for is currently unavailable. Please try again later.
刚装完 PHP.Nginx,准备跑下 phpMyAdmin 程序,结果报以下错误: An error occurred. Sorry, the page you are looking for is ...
- vue.config.js
const path = require('path'); const vConsolePlugin = require('vconsole-webpack-plugin'); // 引入 移动端模拟 ...
- gitlab-ci + k8s 之gitlab-ci(一)
目前常用的持续集成工具主要是jenkins与gitlab-ci ,我已在另一博文中详细记录了jenkins部署过程(其中包括gitlab的搭建),此篇介绍gitlab-ci的使用. 背景介绍 GitL ...
- Vue2.0 $set()的正确使用方式
https://blog.csdn.net/panyang01/article/details/76665448
- layui实现左侧菜单点击右侧内容区显示
https://segmentfault.com/a/1190000014617129
- [Manthan, Codefest 18][Codeforces 1037F. Maximum Reduction]
题目链接:1037F - Maximum Reduction 题目大意:给出一段代码,给你一个长度为n的数组和数字k,求程序运行结果,mod 1e9+7输出 简单翻译下代码的意思,初始定义一个空数组b ...
- input 设置 width:100% 和padding后宽度超出父节点
input 设置 width:100% 和padding后宽度超出父节点 添加如下css即可: box-sizing: border-box; -webkit-box-sizing: border-b ...
- Codeforces 670 - A/B/C/D/E/F - (Done)
链接:https://codeforces.com/contest/670 A - Holidays - [水] AC代码: #include<bits/stdc++.h> using n ...
- [No0000152]C#基础之IL,轻松读懂IL
先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.其实IL本身逻辑很清 ...