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文件中得到访问者的记录。
您可能感兴趣的文章: