【问题标题】:How do I extract the username and password out of a URL in a servlet filter?如何从 servlet 过滤器中的 URL 中提取用户名和密码?
【发布时间】:2023-03-22 09:41:02
【问题描述】:

我创建了一个BasicAuthFilter,它有这个签名:

@Override
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain) throws IOException, ServletException 

如果有人以正确的方式调用带有 Authorization 标头的过滤器,这将起作用。但是,如果有人使用 chrome 或 firefox 访问这样的 url:

http://username:password@localhost:8888

浏览器没有使用该信息填充 Authorization 标头(这让我感到惊讶)。我查看了 chrome 发送的信息,用户名和密码在请求 URL 中,但没有其他地方。

我不知道如何从 URL 中提取该信息。我在HttpServletRequest 上尝试了很多吸气剂,但没有找到任何可以给我用户名和密码的东西。

注意:是的,我知道这是不安全的,当您尝试测试系统时使用它真的很方便。

【问题讨论】:

  • 可以手动解析 URL 字符串...
  • 如果你这样做会发生什么 String url = request.getRequestURI();然后手动解析?
  • @JanVladimirMostert 它包含我的主机之后的路径。
  • @MonadNewb 我很乐意这样做,但我不确定如何获取完整的 URL。我已经对此事进行了一些研究,但每当我尝试时,网址中都没有用户名/密码。
  • @MonadNewb 过滤器正在接收来自浏览器的请求。我没有URL 对象,我有ServletRequest。我在问如何从该签名中的参数中获取用户名和密码。

标签: servlets basic-authentication servlet-filters


【解决方案1】:
    URL url = new URL(custom_url);
    String userInfo = url.getUserInfo();

    String[] userInfoArray = userInfo.split(":");
    System.out.println("username"+userInfoArray[0]);
    System.out.println("password"+userInfoArray[1]);   

【讨论】:

    【解决方案2】:

    我的同事发现 this thread 这意味着这在现代浏览器中是不可能的。出于安全原因,他们拒绝通过网络发送 URL 的用户名:密码部分。

    【讨论】:

    • 这意味着您应该像我建议的那样从Authorization 标头中提取它。您没有收到标头的事实很奇怪 - 我会首先尝试使用端口 8080,如果这不起作用,请尝试在远程计算机(不是本地主机)上以隔离问题。
    【解决方案3】:

    我会在这个answer添加一些东西

    如果密码中包含字符:,则必须指定拆分限制。

    所以:

    String[] userInfoArray = userInfo.split(":");
    

    变成:

    String[] userInfoArray = userInfo.split(":", 2);
    

    2 表示模式 : 仅应用一次(因此生成的长度数组最大为 2)

    【讨论】:

      【解决方案4】:

      对于带有“@”的密码,例如"http://user:p@ssw0rd@private.uri.org/some/service":

          final String authority = uri.getAuthority();
      
          if (authority != null) {
              final String[] userInfo = authority.split(":", 2);
      
              if (userInfo.length > 1) {
                  this.username = userInfo[0];
                  int passDelim = userInfo[1].lastIndexOf('@');
      
                  if (passDelim != -1) {
                      this.password = userInfo[1].substring(0, passDelim);
                  }
              }
          }
      

      请注意,在这种情况下,尝试使用 getUserInfo() 将无济于事,因为 URI 中的 userInfonull

      【讨论】:

        猜你喜欢
        • 2014-08-24
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 2019-03-02
        • 2011-06-26
        相关资源
        最近更新 更多