java servlet过滤器使用示例(2)

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class LoginFilter implements Filter{

private FilterConfig config =null;
  private String filename = null;
  private String filtername = null;
  public void destroy() {
    this.config = null;
    this.filename = null;
    this.filtername = null;
  }

public void doFilter(ServletRequest request , ServletResponse response,
      FilterChain chain ) throws IOException, ServletException {
    HttpServletRequest hRequest = (HttpServletRequest) request;
    // 获取session对象
    HttpSession session = hRequest.getSession();
    // 先判断session中的LOGGED是否有值,如没有则说明是新的请求
    if(null==session.getAttribute("LOGGED")){
      session.setAttribute("LOGGED", "yes");    // 设置LOGGED的值为yes,防止同一会话重复记录
      File file = new File(this.filename);
      if(!file.exists())
        file.createNewFile();        // 判断文件是否存在,如果不存在,就建立一个新的

      /*
       * 创建日志记录内容logContent包括访问者的IP, 访问的页面URL和访问的时间以及日志过滤器的名字
       */
      String logContent = hRequest.getRemoteHost()+"->"+hRequest.getRequestURI()+" Logged "+getTime()+" By s"+this.filtername+"\r\n";
      RandomAccessFile rf = new RandomAccessFile(this.filename,"rw");   // 建立一个随机文件操作对象
      rf.seek(rf.length());   // 将写入指针指向文件的尾部,rf.length()获得文件的长度,seek文件长度这么长得距离正好是文件的尾部
      rf.writeBytes(logContent);   // 将日志写入到文件中去
      rf.close();   // 关闭文件
    }
    chain.doFilter(request, response);
  }

public void init(FilterConfig config) throws ServletException {
    this.config = config;
    this.filename = this.config.getInitParameter("file");
    this.filtername = this.config.getFilterName();
  }

  // 获取时间
  private String getTime(){
    SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
    return sdf.format(new Date());
  }

}

这里利用session来限制同一个会话只会记录一次日志,而不管这个会话中的访问者访问了多少个页面,在第一次访问的时候,由于session的LOGGED是空的,所以这个时候记录日志并把LOGGED设置为yes,这样第二次判断的时候将不会执行记录日志。
然后在来配置XML:

复制代码 代码如下:


<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.filter.LoginFilter</filter-class>
    <init-param>
      <param-name>file</param-name>
      <param-value>D:/log.txt</param-value>
    </init-param>
  </filter>

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

配置好XML后,访问跟目录下地任何文件,都会可以在D:/log.txt文件中得到访问者的记录。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzfdjp.html