【发布时间】:2018-06-22 17:44:18
【问题描述】:
我需要记录触发 [NOT FOUND 404] 错误的 URI。 我使用 .getHeader(HttpHeaders.REFERER) 并且我得到空值。同样,我尝试使用 getRequestURL() 并且我正在获取 @RequestMapping 方法“/error”的路径。
例如: 如果用户输入:mywebsite.com/fdsfihdif 并且没有这样的地址,我应该在这样的日志中看到这个 [NOT FOUND 404] 用户 [john@yahoo.com] 试图访问这个 URI: [mywebsite.com/fdsfihdif]
这是我的错误控制器:
@Controller
public class CustomErrorController implements ErrorController {
private static final Logger log = LogManager.getLogger(CustomErrorController.class);
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if (statusCode == HttpStatus.NOT_FOUND.value()) {
//404 with the wrong URI entered by user
log.error("[NOT FOUND 404] User [" + auth.getName() + "] tried to access this URL : ["+ request.getRequestURL() +"] : [" + request.getHeader(HttpHeaders.REFERER) + "]";
return "errors/404";
} else {
//something else
return "errors/error";
}
}
return "error";
}
@Override
public String getErrorPath() {
return "/error";
}
}
这是输出:
2018-06-22 18:48:59.507 错误 [nio-9090-exec-7] c.b.g.c.CustomErrorController
MSG ==> [未找到 404] 用户 [dumi7ru] 尝试访问此 URL:[http://localhost:9090/error]:[null]
【问题讨论】:
-
你的问题是什么?它为空的最可能原因是什么?你读过javadoc吗? docs.oracle.com/javaee/7/api/javax/servlet/http/…
-
@JB Nizet 我想获得我在示例中提到的 Uri。我该怎么做?谢谢
-
你的方式。只是不要期望每个请求都有这样的标头。有时,只是没有一个,因为人们直接访问一个 URL。有时没有,因为人们不想告诉你他们来自哪里(出于非常好的隐私原因)。有时它们可以被代理删除。
-
@JB Nizet,我想我没有正确地问这个问题......所以我不需要知道他们来自哪里,我需要他们要去的 URL......如何你提到了 人们直接去一个 URL ,所以我需要这个 URL。提前致谢。
-
那么不要从请求中获取referrer URL。获取请求的 URL。 docs.oracle.com/javaee/7/api/javax/servlet/http/…
标签: java spring-boot