假設有這樣的需求:將用戶每次請求的ip、時間、請求、user-agent存入數據庫,很明顯可以用過濾器實現,在過濾器中獲取到這些數據調用mybatis的mapper存入數據庫,但問題來了:mybatis的映射接口規則自動生成的Dao實現類存在於Spring容器中,在filter中如何才能注入或者調用呢?
首先是web.xml配置
<filter>
<!-- 注意下面這個過濾器名稱要跟下面的spring-context.xml的相同 -->
<filter-name>myRequestLogFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myRequestLogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
寫filter
package net.sonngdemo.wms.util;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.*;
import java.io.IOException;
/**
* Created by Administrator on 2017/7/3.
*/
public class ReqeustFilter implements Filter {
@Autowired
private RequestFilterInSpring requestFilterInSpring; /*注入下面的Spring容器中的bean,實現了具體的過濾器方法*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
requestFilterInSpring.filter(request,response); //具體的過濾規則寫在下面一個類中
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
配置Spring-context.xml
<bean name="myRequestLogFilter" class="net.sonngdemo.wms.util.ReqeustFilter" ></bean>
<!-- 注意這個bean的name要跟上面的web.xml中的名稱相同 -->
寫一個Spring Bean,具體實現過濾器方法
package net.sonngdemo.wms.util;
import net.sonngdemo.wms.dao.RequestLogMapper;
import net.sonngdemo.wms.domain.RequestLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* Created by Administrator on 2017/7/3.
*/
@Component("requestFilterInSpring") /*注意名稱跟上面過濾器中注入的名稱相同*/
public class RequestFilterInSpring {
@Autowired
private RequestLogMapper requestLogMapper; /*注入mapper實現類*/
public void filter(ServletRequest request,ServletResponse response){ /*具體實現過濾器方法*/
HttpServletRequest httpRequest=(HttpServletRequest)request;
String uri=httpRequest.getRequestURI();
String regex = "/wms/(css|errorPage|fonts|js|media)/.*";
if (!uri.matches(regex)) {
RequestLog requestLog=new RequestLog();
requestLog.setIp(request.getRemoteHost());
requestLog.setDate(new Date());
requestLog.setRequest(uri);
requestLog.setUserAgent(httpRequest.getHeader("user-agent"));
requestLogMapper.insertLog(requestLog);
}
}
}
其他mapper略
總結:
- web.xml中配置一個過濾器代理
- 寫一個過濾器實現Filter接口,通過調用Spring容器中的bean來實現過濾方法
- 在Spring配置文件中,創建該過濾器的bean對象,注意該該bean的名稱要跟web.xml中的名稱相同
- 寫一個bean,具體實現過濾方法,用@component注解
