Spring Security:如何拦截PageNotFound


问题内容

这似乎是一个简单的问题,但我们在互联网上找不到任何地方。

我们正在使用Spring Security 3.2,我们希望能够在收到spring消息时打印远程主机的IP:

WARN  [org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/page.bla] in DispatcherServlet with name 'XXX'.

我们怎么可能做到这一点?


问题答案:

您的问题与无关spring-security。此日志消息是在DispatcherServlet类中生成的。

您可以扩展org.springframework.web.servlet.DispatcherServlet和覆盖protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception方法:

protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
    if (pageNotFoundLogger.isWarnEnabled()) {
        String requestUri = urlPathHelper.getRequestUri(request);
        pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +"] in DispatcherServlet with name '" + getServletName() + "'");
    }
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
}

通过这种方式,您可以自定义日志消息并向其添加来自HttpServletRequest参数的IP地址:

request.getRemoteAddr();

我不确定这是否是个好习惯。但是应该可以。

希望这可以帮助!!