一:
记录日志也是Filter擅长的工作之一,在request之前和之后都可以记录日志。该日志记录Filter使用 apache的日志工具记录日志,记录客户的IP地址,访问的URL以及消耗的时间。
package com.filter;
import java.io.IOException;
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.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class LogFilter implements Filter {
private Log log = LogFactory.getLog(this.getClass());
private String filterName;
@Override
public void init(FilterConfig config) throws ServletException {
// 获取 Filter 的name,设置在 web-xml 中。
filterName = config.getFilterName();
log.info("自动获取 Filter :" + filterName);
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
long startTime = System.currentTimeMillis();
String requestURI = request.getRequestURI();
// request.getQueryString() 获取查询字符串 比如客户端发送. http://localhost/test.do?a=b&c=d&e=f
// 通过request.getQueryString()得到的是 a=b&c=d&e=f ..
requestURI = request.getQueryString() == null ? requestURI : (requestURI + "?" + request.getQueryString());
chain.doFilter(request, response);
long endTime = System.currentTimeMillis();
log.info(request.getRemoteAddr() + "访问了" + requestURI + ",总共用时" + (endTime - startTime) + "毫秒");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
别忘了 : 配置文件,log4j.Properties
log4j.rootLogger=INFO, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%l]-[%p] %m%n
二:异常捕获
package com.filter; import java.io.IOException; import javax.security.auth.login.AccountException; 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 com.filter.exception.BusinessException; public class ExceptionHandlerFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { chain.doFilter(request, response); } catch (Exception e) { Throwable rootCause = e;// 根异常 while( rootCause.getCause() != null){ // 循环 直到寻找到根异常 为止。 rootCause = rootCause.getCause(); } String message = rootCause.getMessage(); message = message == null ? "异常:" + rootCause.getClass().getName() : message; request.setAttribute("message", message); request.setAttribute("e", e); if(rootCause instanceof AccountException) { request.getRequestDispatcher("/accountException.jsp").forward(request, response); }else if(rootCause instanceof BusinessException) { request.getRequestDispatcher("/businessException.jsp").forward(request, response); }else { request.getRequestDispatcher("/exception.jsp").forward(request, response); } } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <%@ page import="com.filter.exception.AccountException" %> <%@ page import="com.filter.exception.BusinessException" %> <% String action = request.getParameter("action"); if("businessException".equals(action)){ throw new BusinessException("业务操作失败 。 "); }else if("accountException".equals(action)){ throw new AccountException("您需要登陆后再进行此项操作. "); }else if("exception".equals(action)){ Integer.parseInt(""); } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <a href=" ${ pageContext.request.requestURI }?action=businessException" >test businessException</a><br> <a href=" ${ pageContext.request.requestURI }?action=accountException"> test accountException</a><br> <a href=" ${ pageContext.request.requestURI }?action=exception">test exception</a> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <style type="text/css"> .error{ font-size : 12px; padding : 5px; border : 1px solid #FF0000; background : url(image/error.gif)8px 5px no-repeat #FFEEFF; padding-left : 30px'; } </style> </head> <body> <div class="error"> ${ message }<a href="javascript:history.go(-1); ">返回</a> </div> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <style type="text/css"> body, td, div, input { font-size: 12px; } .error { padding: 5px; border: 1px solid #FF0000; background: url(images/error.gif) 8px 5px no-repeat #FFEEFF; padding-left: 30px; } </style> </head> <body> <div class="error"> ${ message } </div> <form action="accountException"> <table> <tr> <td>账号</td> <td> <input type="text" name="account"/> </td> </tr> <tr> <td>密码</td> <td> <input type="text" name="password"/> </td> </tr> <tr> <td> </td> <td><input type="submit" value=" 登录 " /></td> </tr> </table> </form> </body> </html>