这似乎是一个简单的问题,但我们无法在互联网上找到它。
我们正在使用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'.
我们怎么可能这样做?
答案 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