4

我创建了一个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 中提取该信息。我在 上尝试了很多 getter HttpServletRequest,但没有找到任何给我用户名和密码的东西。

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

4

4 回答 4

4
    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]);   
于 2017-02-21T05:35:31.380 回答
3

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

于 2013-08-23T19:04:37.137 回答
-2

我会在这个答案中添加一些东西

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

所以:

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

变成:

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

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

于 2017-10-06T08:41:51.420 回答
-2

对于带有“@”的密码,例如"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()将无济于事userInfo,因为URIis null

于 2017-12-02T13:36:19.643 回答