【问题标题】:HttpServletRequest getHeader(HttpHeaders.REFERER) returns NULLHttpServletRequest getHeader(HttpHeaders.REFERER) 返回 NULL
【发布时间】: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]

Photo example

这是我的错误控制器:

@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


【解决方案1】:

你可以得到原始的 URI

String originalUri = request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);

堆栈上的类似查询web.xml 404 redirect to servlet, how to get the original URI?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 2016-02-14
    • 2013-06-14
    • 2014-11-14
    • 2012-02-14
    • 2023-01-27
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多