spring web,security + web.xml + mvc dispatcher + Bean创建两次
我有如下的Web.xml:
mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1 mvc-dispatcher / springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /api/secure/*
[编辑]
在我添加了spring security后,我收到了错误!
java.lang.IllegalStateException:找不到WebApplicationContext:没有注册ContextLoaderListener?
然后我补充道
contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml org.springframework.web.context.ContextLoaderListener
然后它似乎工作正常,但然后1)问题是豆被创建两次!
如果我只删除它:
contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml
但是留下然后Web应用程序根本不运行
[额外]
完整的Web.xml如下:
Spring MVC Application mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1 mvc-dispatcher / springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /api/secure/* contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml org.springframework.web.context.ContextLoaderListener
这是我的mvc-dispatcher-servlet.xml
在servlet容器生命周期中,容器首先初始化ServletContextListener
,然后初始化Filter
和Servlet
实例。
Spring Web应用程序通常会加载两个上下文:根上下文和调度程序servlet上下文。 ContextLoaderListener
类是一个ServletContextListener
,它加载应用程序(或根)上下文。 它通过context-param
标识要加载的文件,其名称为contextConfigLocation
,如下面的web.xml中所示,如下所示
contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml
或者,默认情况下,通过在/WEB-INF/applicationContext.xml
查找文件。 由于您已将/WEB-INF/mvc-dispatcher-servlet.xml
指定为contextConfigLocation
,因此将加载该上下文。
完成此操作后,容器将初始化DispatcherServlet
,它还会加载上下文。 它通过名为contextConfigLocation
的init-param
元素标识文件加载,如下面的web.xml中所示
dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/appServlet/some-random-location.xml
或者,默认情况下,通过在/WEB-INF/name-of-your-servlet-servlet.xml
查找文件。 换句话说,它获取
元素的值并将-servlet.xml
附加到它并在WEB-INF
查找它。
由于您尚未指定名为contextConfigLocation
的init-param
,因此DispatcherServlet
将上下文文件加载到/WEB-INF/mvc-dispatcher-servlet.xml
,因为其名称为mvc-dispatcher
。 DispatcherServlet
加载的上下文可以访问ContextLoaderListener
加载的bean,这就是我们称之为根上下文(以及其他子项)的原因。
所有这一切都表明, ContextLoaderListener
和DispatcherServlet
都是通过从/WEB-INF/mvc-dispatcher-servlet.xml
的同一文件加载XmlWebApplicationContext
来创建自己的ApplicationContext
副本。
确定您认为应该对整个应用程序可用的bean或配置,并将它们放入将由ContextLoaderListener
加载的文件中。 确定您认为可用于DispatcherServlet
的bean或配置,并将它们放在其上下文文件中。
http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch16s02.html
在初始化DispatcherServlet时,框架将在Web应用程序的WEB-INF目录中查找名为[servlet-name] -servlet.xml的文件,并创建在那里定义的bean(覆盖用于定义的任何bean的定义)全球范围内的同名)。
所以你可以删除context-param:
contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml
Spring MVC然后创建一个新的any-name.xml并放置特定于上下文的bean,如Spring-security.xml,并加载安全bean。
新的xml将是这样的
/WEB-INF/jdbc.properties
现在将其包含在web.xml中
contextConfigLocation /WEB-INF/login-security.xml, /WEB-INF/application-context.xml
希望这会帮助你。