网站异常发送异常代码到邮箱

为了对用户的请求作统一处理,所以把Struct的Action封装成了一个AbstractAction。

其中AbstractAction重写了Action类的execute方法,其中一个统一处理就是异常的处理。

刚好最近想到了代码抛异常时就发邮件通知,这样既能立刻接收到异常的信息,也能对异常归档。

刚开始打算直接用Exception的getCause()内容作为邮件内容发送,不过只有异常的原因,没有异常

出现的定位信息:

e.getCause()
(java.lang.NullPointerException) java.lang.NullPointerException

最后用到Exception的printStackTrace(PrintStream s)方法,并且采用了可变尺寸的线程池来发送邮件,主要是在以前构造的线程可用时将重用它们,代码如下:

try {

// code

} catch (Exception e) {

e.printStackTrace();

logger.error(e.getCause());

ByteArrayOutputStream baos = new ByteArrayOutputStream();

e.printStackTrace(new PrintStream(baos));

String url = request.getRequestURL().toString() ;

if(request.getQueryString()!=null){

url+=”?” + request.getQueryString();

}

exception = “请求地址为:”+url+ “<br>” ;

exception += “请求IP为:”+IPUtil.getIpAddr(request)+ “<br>” ;

exception += baos.toString();

//ex为AbstractAction类的属性

//private ExecutorService ex = Executors.newCachedThreadPool();

ex.execute(new Runnable() {

@Override

public void run() {

// sendEmail(String addr, String title, String content)

eMailService.sendEmail(“XXX@gmail.com”, “后台异常”,exception);

}

});

}

通过获取这些异常信息也可以发现某些对网站的异常访问,例如这次访问产生的异常:(下面代码用*取代了真实IP)

请求地址为:http://******/front/indexNotLogin.do?action=viewAgreement&id=../../../../../../../../../../../../../sbin/../etc/./rc.d/../rc.d/.././passwd%00.htm 请求IP为:203.130.**.*** java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedMethodAccessor239.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at

这样就可以把203.130.**.***这个IP添加到黑名单了!

仅有1条评论 发表评论

  1. 小苍MM /

    强强强~~,太好了,谢谢

发表评论