《使用 Spring 容器管理 Servlet》一文介紹了如何使用 Spring 對 Servlet 進行管理,本文是《使用 Spring 容器管理 Servlet》的姊妹篇,本文介紹如何使用 Spring 對 Filter 進行管理。其實具體原理方法和前者大同小異。
如一般的 J2EE 配置一樣,Spring 在 web.xml 中的配置:
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext*.xml</param-value>
- </context-param>
如一般的 J2EE 配置一樣,Spring 在 applicationContext-service.xml 中定義我們的業務邏輯處理類:
- <bean id="logService"
- class="com.defonds.cds.system.log.impl.LogServiceImpl"
- parent="baseService" scope="singleton" init-method="init" destroy-method="destroy">
- </bean>
如同一般的 Struts1/2 的 action 一樣在我們的 Filter 中注入 service:
- private LogService logService;
- public LogService getLogService() {
- return logService;
- }
-
- public void setLogService(LogService logService) {
- this.logService = logService;
- }
在 Filter 中如同一般的 Struts1/2 的 action 一樣調用 service:
- String ip = logService.getIpAddr(request);
如同一般的 Filter 我們的這個 Filter 需要實現 javax.servlet.Filter 接口:
- public class BlockedIpFilter implements Filter {
根據自己的業務需要去實現 init、doFilter 和 destroy 方法:
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
- FilterChain filterChain) throws IOException, ServletException {
- if (ifIpBlocked) {
- HttpServletRequest request = (HttpServletRequest)servletRequest;
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- String ip = logService.getIpAddr(request);
-
- if (logService.ifBlocked(ip)) {
- response.getWriter().write("error");
- response.getWriter().close();
- } else {
- filterChain.doFilter(request, response);
- }
- } else {
- filterChain.doFilter(servletRequest, servletResponse);
- }
-
- }
-
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- // TODO Auto-generated method stub
- }
-
- @Override
- public void destroy() {
- // TODO Auto-generated method stub
- }