0070 過濾器調用Spring的bean操作數據庫


假設有這樣的需求:將用戶每次請求的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略

總結:

  1. web.xml中配置一個過濾器代理
  2. 寫一個過濾器實現Filter接口,通過調用Spring容器中的bean來實現過濾方法
  3. 在Spring配置文件中,創建該過濾器的bean對象,注意該該bean的名稱要跟web.xml中的名稱相同
  4. 寫一個bean,具體實現過濾方法,用@component注解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM