如何在filter中使用String的IOC

J2EE 码拜 10年前 (2015-04-06) 1426次浏览 0个评论

如题,需求描述如下:
filter中把用户点击的URL、IP、cookie、时间等信息获取出来,保存到数据库,用于分析哪个url使用的最多,同时也作为一个系统日志。
问题:
获取到信息后,要在filter中使用String的注解bean,然后把数据保存。但是,根据系统启动时加载顺序:listener >> filter >> servlet >> spring,在filter加载的时候,spring中的bean还没有加载,这就导致我在filter中使用bean时,bean为null。

在网上找了几种办法,试了都不行:
方法一:

WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); 
        this.baseDao = (ITestDao<Test>)webApplicationContext.getBean("testDao");

其中,ITestDao为接口类,在实现类中有一个注解:@Component(“testDao”)
这种方式报错信息如下:
org.hibernate.HibernateException: No Session found for current thread

方法二:
web.xml中:

<filter>
         <filter-name>DelegatingFilterProxy</filter-name>
         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
         <init-param>
             <param-name>targetBeanName</param-name>
             <param-value>myFilter</param-value>
         </init-param>
         <init-param>
             <param-name>targetFilterLifecycle</param-name>
             <param-value>true</param-value>
         </init-param>
     </filter>

     <filter-mapping>
         <filter-name>DelegatingFilterProxy</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>

在application-beans.xml中:

<bean id="myFilter" 
		class="com.Test.filter.TestFilter">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

在TestFilter中:

this.sessionFactory.getCurrentSession().save(test);

这个也报错,原因为this.sessionFactory.getCurrentSession()为null了。

我使用的是:struts2+hibernate4+spring4

请各位给点化一下,谢谢!

如何在filter中使用String的IOC
30分
就用第一种方法,  不要直接调用dao, 调用service, 一般项目中service层会切入事务,会开启session.

不然就加个OpenSessionInViewFilter 具体作用自己百度一下, 加在你这拦截filter之前.

如何在filter中使用String的IOC
5分
spring不是监听器的时候初始化容器么,报这种错误应该是没加事务吧,楼上说的对,用service,一般事务都加在service层了
如何在filter中使用String的IOC
引用 1 楼 whos2002110 的回复:

就用第一种方法,  不要直接调用dao, 调用service, 一般项目中service层会切入事务,会开启session.

不然就加个OpenSessionInViewFilter 具体作用自己百度一下, 加在你这拦截filter之前.

非常感谢,使用你的方法,确实解决了问题,但是加了opensessionInView后,性能有所降低。但也没有办法,先暂时这样吧。
非常感谢

如何在filter中使用String的IOC
5分
你filter的init方法就会去操作数据库?
如何在filter中使用String的IOC
引用 4 楼 u012345283 的回复:

你filter的init方法就会去操作数据库?

我没有在init方法中去做,我在doFilter中操作的。

如何在filter中使用String的IOC
引用 5 楼 sen_linzhiwang 的回复:
Quote: 引用 4 楼 u012345283 的回复:

你filter的init方法就会去操作数据库?

我没有在init方法中去做,我在doFilter中操作的。

doFilter的话和你服务器启动加载有什么关系?

如何在filter中使用String的IOC
引用 6 楼 u012345283 的回复:
Quote: 引用 5 楼 sen_linzhiwang 的回复:
Quote: 引用 4 楼 u012345283 的回复:

你filter的init方法就会去操作数据库?

我没有在init方法中去做,我在doFilter中操作的。

doFilter的话和你服务器启动加载有什么关系?

你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗?
执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。

如何在filter中使用String的IOC
引用 7 楼 sen_linzhiwang 的回复:
Quote: 引用 6 楼 u012345283 的回复:
Quote: 引用 5 楼 sen_linzhiwang 的回复:
Quote: 引用 4 楼 u012345283 的回复:

你filter的init方法就会去操作数据库?

我没有在init方法中去做,我在doFilter中操作的。

doFilter的话和你服务器启动加载有什么关系?

你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗?
执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。

是的~你可以用Interceptor来做

如何在filter中使用String的IOC
引用 8 楼 u012345283 的回复:
Quote: 引用 7 楼 sen_linzhiwang 的回复:
Quote: 引用 6 楼 u012345283 的回复:
Quote: 引用 5 楼 sen_linzhiwang 的回复:
Quote: 引用 4 楼 u012345283 的回复:

你filter的init方法就会去操作数据库?

我没有在init方法中去做,我在doFilter中操作的。

doFilter的话和你服务器启动加载有什么关系?

你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗?
执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。

是的~你可以用Interceptor来做

哦,我没有用过这个,我试一下

如何在filter中使用String的IOC
引用 8 楼 u012345283 的回复:
Quote: 引用 7 楼 sen_linzhiwang 的回复:
Quote: 引用 6 楼 u012345283 的回复:
Quote: 引用 5 楼 sen_linzhiwang 的回复:
Quote: 引用 4 楼 u012345283 的回复:

你filter的init方法就会去操作数据库?

我没有在init方法中去做,我在doFilter中操作的。

doFilter的话和你服务器启动加载有什么关系?

你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗?
执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。

是的~你可以用Interceptor来做

拦截器实现不了这种方式吧?拦截器只能拦截action,我这里需要获取用户所有的点击内容,不管是action还是jsp。有可能是我对拦截器了解不深吧,其实之前我也想用它,但是想到action很多,而且要实现的话,代码量比使用filter大。

如何在filter中使用String的IOC
引用 10 楼 sen_linzhiwang 的回复:
Quote: 引用 8 楼 u012345283 的回复:
Quote: 引用 7 楼 sen_linzhiwang 的回复:
Quote: 引用 6 楼 u012345283 的回复:
Quote: 引用 5 楼 sen_linzhiwang 的回复:
Quote: 引用 4 楼 u012345283 的回复:

你filter的init方法就会去操作数据库?

我没有在init方法中去做,我在doFilter中操作的。

doFilter的话和你服务器启动加载有什么关系?

你的意思是,执行doFilter方法的时候,Spring的bean已经加载了吗?
执行doFilter的时候,bean确实加载了,但是在加载Filter的时候,bean还没有加载啊,有一个先来后到的问题。这个网上关于这个的说明很多。

是的~你可以用Interceptor来做

拦截器实现不了这种方式吧?拦截器只能拦截action,我这里需要获取用户所有的点击内容,不管是action还是jsp。有可能是我对拦截器了解不深吧,其实之前我也想用它,但是想到action很多,而且要实现的话,代码量比使用filter大。

当然可以,你jsp的调用不是在action里吗?
代码量怎么会变大?和你的action多少有什么关系?

如何在filter中使用String的IOC
jsp的调用不一定都在action里面,比如首页index.jsp。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明如何在filter中使用String的IOC
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!