Filter过滤保存用户的操作日志

在web中会有用到所有用户浏览记录的一个Log记录并输出成报表的形式或者以table的形式展示在后台管理员页面。方便企业更好的运营产品

以下是Filter:

package com.li.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;

import com.ninanlin.zixun.biz.SysLogBiz;
import com.ninanlin.zixun.entity.SysLog;
import com.ninanlin.zixun.entity.User;
import com.ninanlin.zixun.utils.GetTime;
import com.ninanlin.zixun.utils.IpAddress;



/**
 * 用户访问路径记录拦截器
 * 需实现:1)记录请求路径的services方法 2)在session中,记录登录user的用户信息
 *
 *
 */
public  class UserVisitURILogFilter implements Filter{
    

    private SysLogBiz sysLogI;
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc)
            throws IOException, ServletException {
        int userid=0;
        //转换请求
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse Response=(HttpServletResponse)resp;
        HttpSession session=request.getSession();
       
        if(request.getSession().getAttribute(User.SESSION_USER_KEY)!=null){
            //获取请求用户
              userid = (int) request.getSession().getAttribute(User.SESSION_USER_KEY);
        }
            //获取访问时间 精确到秒
            String visitTime=GetTime.getNowTime();
            //获取用户ip
            String user_ip=IpAddress.getRemoteAddr(request);
            //获取来源页面(通过refer)
            String req_method = request.getMethod();                
            String req_refer=request.getHeader("Referer");
            String UserAgent=request.getHeader("User-Agent");
            String Accept=request.getHeader("Accept");
            String AcceptLanguage=request.getHeader("Accept-Language");
            //获取请求地址
            String req_URI= request.getRequestURI();
            SysLog log = new SysLog();
            log.setReq_method(req_method);
            log.setAccept(Accept);
            log.setUser_ip(user_ip);
            log.setReq_refer(req_refer);
            log.setVisitTime(visitTime);
            log.setAcceptLanguage(AcceptLanguage);
            log.setUserAgent(UserAgent);
            log.setReq_URI(req_URI);
            if(userid!=0){
                log.setUserId(userid);
            }
            if(req_URI.contains("/zixun/front")){
                
                saveUserReq(log);
            }
            //跳出当前过滤器
            fc.doFilter(req, resp);
        
        
    }
    
    public void saveUserReq(SysLog sysLog){
        //TODO:如果user为空,记录用户未登录即可
        //TODO:实现保存进数据库即可
         sysLogI.SaveSysLog(sysLog);
    }
    //在filter中无法使用自动注入,自动注入Service会报空指针异常。所以在这里需要手动配置bean,手动获取
    public void init(FilterConfig config) throws ServletException {
        ServletContext sc = config.getServletContext();
        XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
        
        if(cxt != null && cxt.getBean("sysLogI") != null && sysLogI == null)
            sysLogI =  (SysLogBiz) cxt.getBean("sysLogI");  
    }
    public void destroy(){
        
    }    
}

在web.xml中配置如下:

<filter>
        <filter-name>UserVisitURILogFilter</filter-name>
        <filter-class>com.li.filter.UserVisitURILogFilter</filter-class>

</filter>

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

</filter-mapping>

实体类

package com.ninanlin.zixun.entity;

public class SysLog {
    private int id;
    private int userId;
    private String req_URI;
    private String visitTime;
    private String user_ip;
    private String req_refer;
    private String UserAgent;
    private String Accept;
    private String AcceptLanguage;
    private String req_method;
    public String getReq_method() {
        return req_method;
    }
    public void setReq_method(String req_method) {
        this.req_method = req_method;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getReq_URI() {
        return req_URI;
    }
    public void setReq_URI(String req_URI) {
        this.req_URI = req_URI;
    }
    public String getVisitTime() {
        return visitTime;
    }
    public void setVisitTime(String visitTime) {
        this.visitTime = visitTime;
    }
    public String getUser_ip() {
        return user_ip;
    }
    public void setUser_ip(String user_ip) {
        this.user_ip = user_ip;
    }
    public String getReq_refer() {
        return req_refer;
    }
    public void setReq_refer(String req_refer) {
        this.req_refer = req_refer;
    }
    public String getUserAgent() {
        return UserAgent;
    }
    public void setUserAgent(String userAgent) {
        UserAgent = userAgent;
    }
    public String getAccept() {
        return Accept;
    }
    public void setAccept(String accept) {
        Accept = accept;
    }
    public String getAcceptLanguage() {
        return AcceptLanguage;
    }
    public void setAcceptLanguage(String acceptLanguage) {
        AcceptLanguage = acceptLanguage;
    }
    @Override
    public String toString() {
        return "SysLog [id=" + id + ", userId=" + userId + ", req_URI="
                + req_URI + ", visitTime=" + visitTime + ", user_ip=" + user_ip
                + ", req_refer=" + req_refer + ", UserAgent=" + UserAgent
                + ", Accept=" + Accept + ", AcceptLanguage=" + AcceptLanguage
                + "]";
    }
    
}
以上便是所有的过滤器代码,仅供参考,有什么不妥的地方请您提出宝贵的意见,谢谢

posted @ 2017-10-13 09:51  曼殊&沙华  阅读(674)  评论(0)    收藏  举报