先说一下个人需求:记录所有404错误请求。之所以想记录这个错误,是因为很多对系统的渗透攻击都会触发404,很多不法份子会暴力遍历你的资源文件,比如:XXX.zip、XXX.sql等敏感文件。我的目的很简单,对于这种请求进行分析,从而自动屏蔽一些ip保证系统安全。
但是问题来了,我虽然设置了:
me.setError404View("")
但是这个操作只对action请求起作用,对静态资源的访问无效,静态资源的404被undertow捕获了,会提示你一个Not Found。然后我去undertow官网查了下如何自定义404请求,没有查到。度娘了一下,大部分都是在讲springboot。无奈,发了一篇帖子求助波总:https://www.jfinal.com/feedback/6731
上面就是整个事情的经过了,后来我一想,不对啊,我很早之前就研究过undertow啊,也研究过如何自定义错误页面,于是翻了下自己的代码,一番折腾后搞定,好了,废话不多说了,上方案。
方案很简单,我重写了下jfinal-undertow里面的一个类:com.jfinal.server.undertow.WebBuilder,就加了一个方法addErrorPage,感觉这个方法还是很有用的,建议波总后续版本加上。下面贴完整代码:
public WebBuilder addErrorPage(int errorCode,String errorPage) { deploymentInfo.addErrorPage(new ErrorPage(errorPage, errorCode)); return this; }
然后,启动代码:
UndertowServer.create(Config.class).configWeb(builder -> { //错误页面 builder.addErrorPage(404, "你的页面"); }).start();
有个这个方法之后,404啊,500啊,这些错误就都能自定义了。
此外,这个功能已经添加到了 jfinal-undertow,代码在此:
https://gitee.com/jfinal/jfinal-undertow/commit/9f07cfeec48b4695c8e400f022a9dbb80fe6c3b3