問題:
我們為了避免未經授權的人直接通過url訪問我們的頁面,配置了如下filter
<!-- 登錄過濾器 --> <filter> <filter-name>sessionFilter</filter-name> <filter-class>com.sung.risk.client.filter.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping>
在filter中會去驗證用戶是否攜帶了某個cookie,然后去redis查詢該cookie的值是否關聯了用戶信息,如果關聯了,則filter放過;否則返回未認證。
一開始打算注入以下服務(該服務主要進行去redis認證):
@Autowired
SessionService sessionService;
然而,事實證明,注入失敗。
我們的解決辦法:
ServletContext context = request.getServletContext(); ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context); SessionService sessionService = ctx.getBean(SessionService.class);
在filter上加spring的注解是無用的,只會生成兩個該filter的實例A和B(A:tomcat之類的容器管理,B為spring管理)。
A可以讀取web.xml中的配置信息,A是沒有辦法autowired的;B則可以用@autowired注入。但是我們的請求最終進入的是A,所以A中的注入的bean無效。
