Filter (3)【日志记录与异常捕捉】

一:

记录日志也是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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值