- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 DelegatingFilterProxy 将过滤器安装到 Spring Web 应用程序中。该应用程序对我来说是一个黑盒子。我无法控制它,但我知道它使用 Spring。我只控制我的过滤器。
应用程序本身以通常的方式在 web.xml (tomcat 7) 中配置,使用 <listener>...ContextLoaderListener...</listener>
使用通过 <context-param>
指定的 Spring 配置.
我的第一次尝试是共享应用的上下文。我将自己的 spring 配置 XML 添加到 context-param。我的过滤器加载得很好,但我破坏了应用程序。我不确定它到底是怎么坏的,但看起来它不能再建立数据库连接了。我检查了明显的东西。没有 bean 名称冲突或属性名称冲突。
我真正想做的是拥有 2 个完全独立的上下文,这样,大概我的过滤器就无法影响黑盒应用程序。有没有一种方法可以配置 web.xml 以使 Spring 仅为我的过滤器创建一个新的上下文?
stackoverflow上有几个类似的问题,但细节差异很大。
我正在按要求发布我的 web.xml,但请记住,这不是我想要做的。你在这里看到的是我的过滤器和共享相同上下文的网络应用程序,这不是我想要的。我问是否有可能有两个完全独立的上下文,以便过滤器和 Web 应用程序彼此完全隔离(至少在 Spring 级别)。
我下面的部分是过滤器声明和过滤器映射以及spring xml上下文配置的第二行(类路径:...)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>xxx</display-name>
<description>xxx</description>
<filter>
<filter-name>myAccessFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>myAccessFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/applicationContext.xml
classpath:my-access-spring.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<servlet>
<servlet-name>spring-flex</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>xxx-rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all /messagbroker requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>spring-flex</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>xxx-rest</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<error-page>
<error-code>401</error-code>
<location>/error-401.html</location>
</error-page>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
时间流逝:关于为什么在这种情况下共享上下文不是一个好主意,我有了更多信息。事实证明我确实有 bean 冲突。特别是,我的过滤器和底层应用程序都使用了一个名为“dataSource”的 bean(当然)。
一旦我重命名了我的 bean,我就从 Spring 收到了一条非常明确的消息:
No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: dataSource,deoDataSource
大概应用程序是按类型而不是按名称使用接线,所以我有一个明显的冲突。
所以!最初的问题仍然存在:是否可以将 Spring 配置为仅为我的过滤器创建一个单独的上下文?
谢谢,弗雷德
最佳答案
有两种方法可以解决您的问题:
可以通过 XML 配置将特定 beans 排除为 Autowiring 候选者:
<bean class="foo.bar.Baz" autowire-candidate="false" />
我对你的问题的评论不正确 - 你不能让 ContextLoaderListener
加载两个单独的上下文。但是您可以通过使用 DispatcherServlet
来为您加载第二个上下文来解决一些问题:
<!-- Use this just to load second application context -->
<servlet>
<servlet-name>filterContextLoader</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:filter-context.xml</param-value>
</init-param>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>filterContext</param-value>
</init-param>
</servlet>
<filter>
<filter-name>customFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>contextAttribute</param-name>
<param-value>filterContext</param-value>
</init-param>
</filter>
当然,DispatcherServlet
会使用所谓的默认策略 并自动注册各种不必要的 bean(默认处理程序映射、处理程序适配器... ).但这应该是无害的。如果你想注册没有不必要的 bean 的干净上下文,你需要实现你自己的 ServletContextListener
来做到这一点。
关于java - DelegatingFilterProxy 的独立 Spring 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609793/
我正在尝试使用 Spring 安全性执行一些自定义身份验证。 我读过一些关于它的东西: > https://stackoverflow.com/a/4074532/759452 > https://s
在寻找错误时,我遇到了 Spring 3.0.5 源代码 DelegatingFilterProxy我想知道它是否存在性能瓶颈。 鉴于每个 Web 应用程序只有一个 DelegatingFilterP
我正在使用 spring mvc 开发 Web 应用程序。我想将 spring bean 注入(inject)到我的 Servlet Filter 中。 我引用了这个教程http://www.dead
DelegatingFilterProxy 有两个可以在我的应用程序中使用的构造函数 new DelegatingFilterProxy(String beanName); new Delegatin
我有以下问题: 我正在使用 Spring MVC 3 开发基于 Web 的应用程序。在我的 web.xml 配置中,我有两个上下文(root-context.xml - 全局上下文 - 由 Conte
我正在尝试使用 DelegatingFilterProxy 将过滤器安装到 Spring Web 应用程序中。该应用程序对我来说是一个黑盒子。我无法控制它,但我知道它使用 Spring。我只控制我的过
我正在尝试将 spring bean 注入(inject)过滤器,但无法使其工作。 注入(inject)的 bean 始终为“null”。我在 Controllers 和 HandlerInterce
我创建了一个 spring 安全过滤器,如下所示。 springSecurityFilterChain org.springframewo
谁能帮我解决我的tomcat运行错误,当我运行tomcat时出现以下错误: SEVERE: Exception starting filter springSecurityFilterChain ja
我们正在使用使用 AbstractSecurityWebApplicationInitializer 初始化的 Spring 安全性。我们还有一个单独的 Web 应用初始化程序,它从 Abstract
首先,我是 Spring security 和 Intellij IDEA 的新手。 我在 Intellij IDEA 中创建了一个入门 Spring Security 项目,它使用 Spring 版
我在我的 Spring MVC 应用程序中有一个作为 DelegatingFilterProxy 实现的过滤器,它被调用了两次。我不知道发生了什么。我确定 Spring 上下文没有被创建两次,因为所有
我有一个无法修改的第 3 方 servlet。它接受一个我想外部化的 init-param(来自 web.xml)。 我可以使用 DelegatingFilterProxy 外部化一个 servlet
当 tomcat 启动时,我在 org.springframework.web.filter.DelegatingFilterProxy 上得到 ClassNotFoundException,我已经包
我知道以前曾有人问过这个问题,但建议的答案都不适合我。使用 Spring Security 启动 Jetty 时出现此错误: No bean named 'org.springframework.we
我是一名优秀的程序员,十分优秀!