对web.xml当中filter的init-param的当前路径的测试

来源:互联网 发布:java仓库管理系统源码 编辑:程序博客网 时间:2024/06/05 02:53
这两天一直在设法实现使用过滤器处理日志记录。

我们知道,对于客户端的每一个request,web容器都会根据web.xml的配置内容,先使用配置的filter进行处理,然后交付到对应的controller去处理。

我这里想实现的就是,利用web.xml里面配置的filter。首先,记录来访者的IP和要访问的资源。然后,再把request交付给对应的controller去处理,实现来访信息记录。

其中,日志功能使用了log4j对应的jar:slf4j-api.jar和slf4j-log4j.jar两个。

编写的filter的代码如下:

package test;import org.apache.log4j.*;import java.io.IOException;import javax.servlet.*;import javax.servlet.http.*;/** * Created with IntelliJ IDEA. * Date: 13-7-6 * Time: 上午10:34 * To change this template use File | Settings | File Templates. */public class Filter_Log implements Filter {    //declare a object of Log    private Logger log = LogManager.getLogger(this.getClass());    //declare a variable named fileName, to represent the name of the current Filter    private String fileName;    public void init(FilterConfig config) throws ServletException {        // get the name of Filter, and assigned to filterName        fileName = config.getInitParameter("logDate");//        String realPath = config.getServletContext().getRealPath(fileName);        System.out.print(fileName);        FileAppender fileAppender = null;        SimpleLayout simpleLayout = new SimpleLayout();        //set to load log when start        try {            fileAppender = new FileAppender(simpleLayout,fileName,true);            log.addAppender(fileAppender);            log.setLevel((Level)Level.DEBUG);            log.info("start Filter bla bla bla "+fileName);        } catch (IOException e) {            System.out.print("error exists!!!!bla bla");            log.error("file not found",e);        }        log.info("start Filter: bla bla bla  "+fileName);    }    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException{        //        HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) res;        long startTime = System.currentTimeMillis();        String requestURI = request.getRequestURI();        requestURI = request.getQueryString() == null ?requestURI:(requestURI + "?" + request.getQueryString());        chain.doFilter(request,response);        long endTime = System.currentTimeMillis();        log.info(request.getRemoteAddr() + " access " + requestURI + ", total time is " + (endTime - startTime) + " millionseconds");    }    public void destroy (){        log.info("close filter: alb alb alb "+fileName);    }}

在web.xml中的配置如下:
 <filter>        <filter-name>Log</filter-name>        <filter-class>test.Filter_Log</filter-class>        <init-param>            <param-name>logDate</param-name>            <param-value>LogDate.txt</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>Log</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

然后,编写一个前台页面index.jsp.。内容随意了。

现在,问题来了:LogDate.txt文件到底在哪里????

答案是:你的JVM的bin目录下。这个还望大神们给个解释,小弟这厢有礼了!!!

另外,如果web.xml里面配置的是/LogDate.txt的话。LogDate.txt文件又是在哪里呢

答案是:你的C盘根目录。同志们,有疑问的可以自己实践一下!!!

个人配置如下:

OS:windows  XP SP2

web容器:Apache Tomcat/7.0.27

IDE:Intellij IDEA12.1.3

别的配置信息,就木有值得一提的了。

PS:当前的所有测试是在Intellij IDEA12.1.3中直接运行本地tomcat7.0服务器,并部署项目时的测试结果。


实际部署在tomcat服务器上的时候

当把项目文件拷贝到tomcat的webapps\XXX\中时,

  1. <init-param>            <param-name>logDate</param-name>            <param-value>LogDate.txt</param-value>        </init-param>

    此时,LogDate.txt是在tomcat的bin所在的那层目录
  2. <init-param>            <param-name>logDate</param-name>            <param-value>/LogDate.txt</param-value>        </init-param>

    此时LogDate.txt是在当前盘符的根目录