Debugging Tips: HttpServletRequest 中获取所有参数

起因

业务需要跟第三方厂商进行 OAuth 对接,在开发者平台有个授权页面,授权之后如果成功就会拿到 accessToken,问题就出在获取的时候失败了。

过程

获取 Token 报错,首先检查入参是否有问题,OAuth 工程是用的 spring security,记录日志用了 AOP 去实现的,但是切入有点靠后,记录的都是成功的完整参数,所以查看日志就没用了。
通过查看源码找到了原始入参在这里,先在本地构造个参数缺失请求,自己打印下 request 内容找找看,通过 IDEA 可以查看到内容。

package org.springframework.security.oauth2.provider.client;

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException, IOException, ServletException {

继续上生产环境把 Arthas 挂上,开始抓入参,启动 Arthas 用启动 JVM 同一个用户才可以。

获取 HttpServletRequest 所有参数用到的方法:

request.getParameterMap();
request.getParameterNames();

前置操作都准备好了,上生产抓参数命令:

watch org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter attemptAuthentication 'params[0].getParameterMap()' -x 3

再次触发请求,抓到入参如下,发现是缺少 client_secret 参数,到这为止就清楚问题所在了。

总结

  1. IDEA 中 debug 查看 request 的 parameter 姿势
    request->request->request->request->request->coyoteRequest->parameters->paramHashValues
    request->request->request->request->request->inputStream->ib->coyoteRequest->parameters->paramHashValues 
  2. AOP 打印日志不能太靠后,这样导致失败请求都无法记录,无法快速重现定位问题。
  3. HttpServletRequest 中每个方法的注释需要去过一遍,留点记忆。

评论

  1. 1
    1

    555

    回复
  2. 1
    1

    1

    回复
  3. 1
    1

    555

    回复
  4. 1
    1

    1

    回复
    1. 1
      1

      1

      回复
  5. 1
    1

    1

    回复
    1. 1
      1

      1

      回复
    2. 1
      1

      1

      回复
    3. 1
      1

      1

      回复
    4. 1
      1

      1

      回复
    5. 1
      1

      1

      回复
    6. 1
      1

      1

      回复
    7. 1
      1

      1

      回复
  6. 1
    1

    1

    回复
  7. 1
    1

    1

    回复
  8. 1
    1

    1

    回复
  9. 1
    1

    1

    回复
  10. 1
    1

    1

    回复
  11. 1
    1

    1

    回复
    1. 1
      1

      1

      回复
    2. 1
      1

      1

      回复
    3. 1
      1

      1

      回复
    4. 1
      1

      1

      回复
    5. 1
      1

      1

      回复
    6. 1
      1

      1

      回复
    7. 1
      1

      1

      回复
    8. 1
      1

      1

      回复
    9. 1
      1

      1

      回复
    10. 1
      1

      1

      回复
    11. 1
      1

      1

      回复
    12. 1
      1

      1

      回复
    13. 1
      1

      1

      回复
    14. 1
      1

      1

      回复
      1. 1
        1

        1

        回复
      2. 1
        1

        1

        回复
      3. 1
        1

        1

        回复
      4. 1
        1

        1

        回复
      5. 1
        1

        1

        回复
      6. 1
        1

        1

        回复
    15. 1
      1

      1

      回复
      1. 1
        1

        1

        回复
      2. 1
        1

        1

        回复
      3. 1
        1

        1

        回复
      4. 1
        1

        1

        回复
      5. 1
        1

        1

        回复
      6. 1
        1

        1

        回复
      7. 1
        1

        1

        回复
      8. 1
        1

        1

        回复
      9. 1
        1

        1

        回复
      10. 1
        1

        1

        回复
      11. 1
        1

        1

        回复
      12. 1
        1

        1

        回复
    16. 1
      1

      1

      回复
    17. 1
      1

      1

      回复
    18. 1
      1

      1

      回复
    19. 1
      1

      1

      回复
    20. 1
      1

      1

      回复
  12. 1
    1

    1

    回复
  13. 1
    1

    1

    回复
  14. 1
    1

    1

    回复
  15. 1
    1

    1

    回复
  16. 1
    1

    555

    回复
    1. 1
      1

      1

      回复
  17. 1
    1

    1

    回复
    1. 1
      1

      1

      回复
    2. 1
      1

      1

      回复
    3. 1
      1

      1

      回复
    4. 1
      1

      1

      回复
    5. 1
      1

      1

      回复
    6. 1
      1

      1

      回复
      1. 1
        1

        555

        回复
      2. 1
        1

        1

        回复
      3. 1
        1

        1

        回复
      4. 1
        1

        1

        回复
      5. 1
        1

        1

        回复
      6. 1
        1

        1

        回复
      7. 1
        1

        1

        回复