如何从servlet过滤器中的URL中提取用户名和密码?

时间:2013-08-23 18:20:16

标签: servlets basic-authentication servlet-filters

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

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

如果有人以正确的方式设置了Authorization标头来调用过滤器,则此功能正常。但是,如果有人在chrome或firefox上访问这样的网址:

http://username:password@localhost:8888

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

我无法弄清楚如何从URL中提取该信息。我在HttpServletRequest上尝试了很多getter,但没有找到任何能给我输入用户名和密码的东西。

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

4 个答案:

答案 0 :(得分:3)

我的同事发现this thread暗示这在现代浏览器中是不可能的。出于安全原因,他们拒绝在网上发送用户名:密码的一部分。

答案 1 :(得分: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 :(得分:-3)

我将向此answer

添加内容

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

所以:

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

变为:

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

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

答案 3 :(得分:-3)

对于带有'@'的密码,例如"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的{​​{1}}为URI