Spring Security:如何拦截PageNotFound

时间:2014-04-30 19:05:42

标签: java spring security spring-mvc

这似乎是一个简单的问题,但我们无法在互联网上找到它。

我们正在使用Spring Security 3.2,我们希望每当收到春天消息时都能打印远程主机的IP:

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

我们怎么可能这样做?

3 个答案:

答案 0 :(得分:1)

这只是部分答案;它解决了问题,但没有使用弹簧安全性。

创建一个过滤器,用于检查响应中的状态(response.getStatus())。 如果状态代码是您关心的状态代码(例如404或HttpServletResponse.SC_NOT_FOUND),请记录一条消息,其中包含您要存储的请求中的详细信息。

答案 1 :(得分:1)

您的问题与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();

我不确定这是一个好习惯..但它应该有效。

希望这会有所帮助!!

答案 2 :(得分:1)

从Spring 4.0开始,如果你正在使用@ControllerAdvice,那么你也可以通过配置{{1}来启用Spring在检测到NoHandlerFoundException时抛出PageNotFound的事实。 }:

DispatcherServlet

然后,在您的@Configuration public class ApplicationConfiguration { @Autowired void configureDispatcherServlet( DispatcherServlet dispatcherServlet ) { dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); } } 中,您将能够处理此异常以返回自定义数据:

@ControllerAdvice