【问题标题】:How do I debug a request in Spring Boot?如何在 Spring Boot 中调试请求?
【发布时间】:2019-09-13 17:44:59
【问题描述】:

我的计算机重新启动,我的应用程序今天不再工作。昨天还在工作。除了 Maven 下载新库(主要是亚马逊)之外,什么都没有改变。现在我什至无法访问/admin/login 页面。如何调试请求?

2019-09-13 17:26:16.924  INFO 2056 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/login],methods=[GET]}" onto public java.lang.String com.s.s.controller.Controller.login()
2019-09-13 17:26:21.465 ERROR 2056 --- [nio-8080-exec-1] c.s.s.c.Controller     : invalidRequest(): invalid request: /admin/login

@RequestMapping(value="/admin/login", method=RequestMethod.GET)
public String login() {
    return "login";
}
@RequestMapping("/error")
public void invalidRequest(HttpServletRequest request, HttpServletResponse response){

    Logger.error(TAG, "invalidRequest()", "invalid request: " + request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI));
    try {
        response.setStatus(HttpStatus.OK.value());
        response.getWriter().write("This is not a valid request");
    } catch (IOException e) {
        Logger.error(TAG, "invalidRequest: ", "Exception in invalidRequest() method "+e.getMessage());
    }
}
@Override
public String getErrorPath() {
    return "/error";
}

我在application.properties 中设置了这一行,但它没有打印任何额外内容。

logging.level.com.s.s.controller.Controller=DEBUG

我运行了mvn clean 并重新启动了服务器,但它没有帮助。

我在application.properties 中设置了这一行,但它没有打印任何有用的信息。

debug=true

日志:

2019-09-13 17:40:25.459 DEBUG 2056 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.apache.catalina.connector.RequestFacade@4d3e8c3a
2019-09-13 17:40:25.460 DEBUG 2056 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4d3e8c3a

2019-09-13 17:40:25.463 ERROR 2056 --- [nio-8080-exec-1] c.s.s.c.Controller     : invalidRequest(): invalid request: /admin/login
2019-09-13 17:40:25.477 DEBUG 2056 --- [nio-8080-exec-2] o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.apache.catalina.connector.RequestFacade@4d3e8c3a
2019-09-13 17:40:25.484 DEBUG 2056 --- [nio-8080-exec-2] o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4d3e8c3a

$ git status
        modified:   src/main/resources/application.properties 
        modified:   src/main/resources/static/js/home.js      

我将库与上次部署的库进行了比较,唯一的变化是

aws-java-sdk-core-1.11.631.jar
aws-java-sdk-kms-1.11.631.jar
aws-java-sdk-s3-1.11.631.jar
aws-java-sdk-ses-1.11.631.jar
jmespath-java-1.11.631.jar

我评论了public String getErrorPath()public void invalidRequest(),现在它给了我

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Sep 13 18:59:03 UTC 2019
There was an unexpected error (type=Forbidden, status=403).
No message available

但是curl 它给出了

$ curl localhost:8080/admin/login
{"timestamp":1568401131164,"status":403,"error":"Forbidden","message":"No message available","path":"/admin/login"}

我在 Makgigrahul 的回答中发现以下搜索 spring-sleuth 并将其添加到 application.properties 生成此日志。

logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG

日志:

2019-09-13 16:10:11.329 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing servlet 'dispatcherServlet'
2019-09-13 16:10:11.330  INFO 15356 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2019-09-13 16:10:11.331  INFO 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2019-09-13 16:10:11.332 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Using MultipartResolver [org.springframework.web.multipart.support.StandardServletMultipartResolver@6481dcd8]
2019-09-13 16:10:11.332 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Using LocaleResolver [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@50cc90f2]
2019-09-13 16:10:11.339 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Unable to locate ThemeResolver with name 'themeResolver': using default [org.springframework.web.servlet.theme.FixedThemeResolver@135fd762]
2019-09-13 16:10:11.345 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Unable to locate RequestToViewNameTranslator with name 'viewNameTranslator': using default [org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@61cc4a6b]
2019-09-13 16:10:11.352 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Unable to locate FlashMapManager with name 'flashMapManager': using default [org.springframework.web.servlet.support.SessionFlashMapManager@766c1f26]
2019-09-13 16:10:11.353 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Published WebApplicationContext of servlet 'dispatcherServlet' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcherServlet]
2019-09-13 16:10:11.355  INFO 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 23 ms
2019-09-13 16:10:11.356 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Servlet 'dispatcherServlet' configured successfully
2019-09-13 16:10:11.376 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error]
2019-09-13 16:10:11.383 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/error] is: -1
2019-09-13 16:10:11.408 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Rendering view [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@53191939] in DispatcherServlet with name 'dispatcherServlet'
2019-09-13 16:10:11.415 DEBUG 15356 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Successfully completed request

【问题讨论】:

  • 你能在你的IDE上调试吗?
  • org.springframework.httporg.springframework.web 的日志级别设置为DEBUG 是一个很好的起点。
  • @Mike 我设置了它们,结果如下:pastiebin.com/5d7bfaf6f1eb1
  • @Chloe 嗯,没有太多...你能不能也为org.springframework.security 设置DEBUG 级别,然后再试一次?

标签: java spring spring-boot spring-security


【解决方案1】:

您可以尝试在 org.apache.catalina.core.ApplicationFilterChain#doFilter 中设置断点。这在请求处理的开始就很漂亮。或者你可以看看 org.springframework.web.servlet.DispatcherServlet#doDispatch

【讨论】:

  • 如何在 Eclipse 中调试?我试图添加一个服务器(Apache),但它要求提供 Tomcat 安装目录。 Spring Boot 使用嵌入式 Tomcat 服务器。我通常使用mvn spring-boot:run 运行应用程序。
  • 可以在调试模式下使用main方法启动类。它是用@SpringBootApplication 注释的。并且 ApplicationFilterChain 应该在您的 Maven 依赖项中。所以你可以在 Eclipse 中打开这些类来设置断点。您不必添加服务器。 Spring boot 包含一个嵌入式 tomcat 服务器
【解决方案2】:

我能够使用 Andreas 的答案进行调试,看到了 request.request.filterChain.filters[] 的值,看到了我的过滤器 remoteAddressFilter(),看到了 remoteAddress = 0:0:0:0:0:0:0:1。我有一个 IP 过滤器 (RemoteAddrFilter),其中一个允许值是 127.0.0.1。我正在使用http://localhost:8080/admin/home 访问服务器,它显然使用了IP6 地址。可能是重新启动计算机的 Windows 更新改变了网络行为。当我使用http://127.0.0.1:8080/admin/home 时,它可以工作。我想将日志记录添加到过滤器以在被阻止时通知,但没有明显的方法。 Amazing Spring 不会在调试模式下记录过滤器。

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2023-04-05
    • 2019-03-21
    • 1970-01-01
    • 2016-01-24
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多